vlc | branch: master | Rémi Denis-Courmont <r...@remlab.net> | Mon Nov 14 21:33:13 2016 +0200| [72c69dab571fab484e2fd008d3f6059333c26b67] | committer: Rémi Denis-Courmont
sd: reorder initialization and merge two allocations > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=72c69dab571fab484e2fd008d3f6059333c26b67 --- src/playlist/services_discovery.c | 179 +++++++++++++++++++------------------- 1 file changed, 89 insertions(+), 90 deletions(-) diff --git a/src/playlist/services_discovery.c b/src/playlist/services_discovery.c index 5a17b79..d1b2993 100644 --- a/src/playlist/services_discovery.c +++ b/src/playlist/services_discovery.c @@ -238,9 +238,9 @@ services_discovery_RemoveItem ( services_discovery_t * p_sd, input_item_t * p_it struct vlc_sd_internal_t { /* the playlist items for category and onelevel */ - playlist_item_t *p_node; - services_discovery_t *p_sd; /**< Loaded service discovery modules */ - char *psz_name; + playlist_item_t *node; + services_discovery_t *sd; /**< Loaded service discovery modules */ + char name[]; }; /* A new item has been added to a certain sd */ @@ -302,122 +302,121 @@ static void playlist_sd_item_removed( const vlc_event_t * p_event, void * user_d PL_UNLOCK; } -int playlist_ServicesDiscoveryAdd( playlist_t *p_playlist, - const char *psz_name ) +int playlist_ServicesDiscoveryAdd(playlist_t *playlist, const char *chain) { - /* Perform the addition */ - services_discovery_t *p_sd; - - msg_Dbg( p_playlist, "adding services_discovery %s...", psz_name ); - p_sd = vlc_sd_Create( VLC_OBJECT(p_playlist), psz_name ); - if( !p_sd ) + vlc_sd_internal_t *sds = malloc(sizeof (*sds) + strlen(chain) + 1); + if (unlikely(sds == NULL)) return VLC_ENOMEM; - /* Free in playlist_ServicesDiscoveryRemove */ - vlc_sd_internal_t * p_sds = malloc( sizeof(*p_sds) ); - if( !p_sds ) - { - vlc_sd_Destroy( p_sd ); - return VLC_ENOMEM; - } + /* Look for configuration chain "longname" */ + const char *longname = "?"; + config_chain_t *cfg; + char *name; - playlist_item_t *p_node; + free(config_ChainCreate(&name, &cfg, chain)); + msg_Dbg(playlist, "adding services_discovery %s...", name); - /* Look for configuration chain "longname" */ - const char *psz_longname = "?"; - if( p_sd->p_cfg ) - { - config_chain_t *cfg = p_sd->p_cfg; - while( cfg ) + for (config_chain_t *p = cfg; p != NULL; p = p->p_next) + if (cfg->psz_name != NULL && !strcmp(cfg->psz_name, "longname")) { - if( cfg->psz_name && !strcmp( cfg->psz_name, "longname" ) ) - { - psz_longname = cfg->psz_value; - break; - } - cfg = cfg->p_next; + if (cfg->psz_value != NULL) + longname = cfg->psz_value; + break; } - } - PL_LOCK; - p_node = playlist_NodeCreate( p_playlist, psz_longname, - p_playlist->p_root, PLAYLIST_END, - PLAYLIST_RO_FLAG | PLAYLIST_SKIP_FLAG, - NULL ); - PL_UNLOCK; + playlist_Lock(playlist); + sds->node = playlist_NodeCreate(playlist, longname, playlist->p_root, + PLAYLIST_END, + PLAYLIST_RO_FLAG|PLAYLIST_SKIP_FLAG, NULL); + playlist_Unlock(playlist); - vlc_event_manager_t *em = services_discovery_EventManager( p_sd ); - vlc_event_attach( em, vlc_ServicesDiscoveryItemAdded, - playlist_sd_item_added, p_node ); + config_ChainDestroy(cfg); + free(name); - vlc_event_attach( em, vlc_ServicesDiscoveryItemRemoved, - playlist_sd_item_removed, p_node ); + if (unlikely(sds->node == NULL)) + { + free(sds); + return VLC_ENOMEM; + } - if( !vlc_sd_Start( p_sd ) ) + /* Perform the addition */ + sds->sd = vlc_sd_Create(VLC_OBJECT(playlist), chain); + if (unlikely(sds->sd == NULL)) { - vlc_sd_Destroy( p_sd ); - free( p_sds ); - return VLC_EGENERIC; + playlist_Lock(playlist); + playlist_NodeDelete(playlist, sds->node, true, false); + playlist_Unlock(playlist); + free(sds); + return VLC_ENOMEM; } - p_sds->p_sd = p_sd; - p_sds->p_node = p_node; - p_sds->psz_name = strdup( psz_name ); + vlc_event_manager_t *em = services_discovery_EventManager(sds->sd); + vlc_event_attach(em, vlc_ServicesDiscoveryItemAdded, + playlist_sd_item_added, sds->node); + vlc_event_attach(em, vlc_ServicesDiscoveryItemRemoved, + playlist_sd_item_removed, sds->node); - PL_LOCK; - TAB_APPEND( pl_priv(p_playlist)->i_sds, pl_priv(p_playlist)->pp_sds, p_sds ); - PL_UNLOCK; + if (!vlc_sd_Start(sds->sd)) + { + vlc_sd_Destroy(sds->sd); + playlist_Lock(playlist); + playlist_NodeDelete(playlist, sds->node, true, false); + playlist_Unlock(playlist); + free(sds); + return VLC_EGENERIC; + } + + strcpy(sds->name, chain); + playlist_Lock(playlist); + TAB_APPEND(pl_priv(playlist)->i_sds, pl_priv(playlist)->pp_sds, sds); + playlist_Unlock(playlist); return VLC_SUCCESS; } -int playlist_ServicesDiscoveryRemove( playlist_t * p_playlist, - const char *psz_name ) +int playlist_ServicesDiscoveryRemove(playlist_t *playlist, const char *name) { - playlist_private_t *priv = pl_priv( p_playlist ); - vlc_sd_internal_t * p_sds = NULL; + playlist_private_t *priv = pl_priv(playlist); + vlc_sd_internal_t *sds = NULL; - PL_LOCK; - for( int i = 0; i < priv->i_sds; i++ ) + playlist_Lock(playlist); + for (int i = 0; i < priv->i_sds; i++) { - if( !strcmp( psz_name, priv->pp_sds[i]->psz_name ) ) + vlc_sd_internal_t *entry = priv->pp_sds[i]; + + if (!strcmp(name, entry->name)) { - p_sds = priv->pp_sds[i]; - REMOVE_ELEM( priv->pp_sds, priv->i_sds, i ); + REMOVE_ELEM(priv->pp_sds, priv->i_sds, i); + sds = entry; break; } } - PL_UNLOCK; + playlist_Unlock(playlist); - if( !p_sds ) + if (sds == NULL) { - msg_Warn( p_playlist, "discovery %s is not loaded", psz_name ); + msg_Warn(playlist, "discovery %s is not loaded", name); return VLC_EGENERIC; } - services_discovery_t *p_sd = p_sds->p_sd; - assert( p_sd ); - - vlc_sd_Stop( p_sd ); + assert(sds->sd != NULL); - vlc_event_detach( services_discovery_EventManager( p_sd ), - vlc_ServicesDiscoveryItemAdded, - playlist_sd_item_added, - p_sds->p_node ); + vlc_sd_Stop(sds->sd); - vlc_event_detach( services_discovery_EventManager( p_sd ), - vlc_ServicesDiscoveryItemRemoved, - playlist_sd_item_removed, - p_sds->p_node ); + vlc_event_detach(services_discovery_EventManager(sds->sd), + vlc_ServicesDiscoveryItemAdded, + playlist_sd_item_added, sds->node); + vlc_event_detach(services_discovery_EventManager(sds->sd), + vlc_ServicesDiscoveryItemRemoved, + playlist_sd_item_removed, sds->node); + vlc_sd_Destroy(sds->sd); /* Remove the sd playlist node if it exists */ - PL_LOCK; - playlist_NodeDelete( p_playlist, p_sds->p_node, true, false ); - PL_UNLOCK; + playlist_Lock(playlist); + playlist_NodeDelete(playlist, sds->node, true, false); + playlist_Unlock(playlist); - vlc_sd_Destroy( p_sd ); - free( p_sds->psz_name ); - free( p_sds ); + free(sds); return VLC_SUCCESS; } @@ -431,9 +430,9 @@ bool playlist_IsServicesDiscoveryLoaded( playlist_t * p_playlist, for( int i = 0; i < priv->i_sds; i++ ) { - vlc_sd_internal_t *sd = priv->pp_sds[i]; + vlc_sd_internal_t *sds = priv->pp_sds[i]; - if( sd->psz_name && !strcmp( psz_name, sd->psz_name ) ) + if (!strcmp(psz_name, sds->name)) { found = true; break; @@ -452,12 +451,12 @@ int playlist_ServicesDiscoveryControl( playlist_t *p_playlist, const char *psz_n PL_LOCK; for( i = 0; i < priv->i_sds; i++ ) { - vlc_sd_internal_t *sd = priv->pp_sds[i]; - if( sd->psz_name && !strcmp( psz_name, sd->psz_name ) ) + vlc_sd_internal_t *sds = priv->pp_sds[i]; + if (!strcmp(psz_name, sds->name)) { va_list args; va_start( args, i_control ); - i_ret = vlc_sd_control( sd->p_sd, i_control, args ); + i_ret = vlc_sd_control(sds->sd, i_control, args ); va_end( args ); break; } @@ -474,6 +473,6 @@ void playlist_ServicesDiscoveryKillAll( playlist_t *p_playlist ) playlist_private_t *priv = pl_priv( p_playlist ); while( priv->i_sds > 0 ) - playlist_ServicesDiscoveryRemove( p_playlist, - priv->pp_sds[0]->psz_name ); + playlist_ServicesDiscoveryRemove(p_playlist, + priv->pp_sds[0]->name); } _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits