vlc | branch: master | Rémi Denis-Courmont <r...@remlab.net> | Mon Nov 14 21:38:40 2016 +0200| [1a8808dfd8a6683c7525f8ffa4c07c423bec0a51] | committer: Rémi Denis-Courmont
sd: avoid name look-up when destroying everything > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1a8808dfd8a6683c7525f8ffa4c07c423bec0a51 --- src/playlist/services_discovery.c | 54 ++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/src/playlist/services_discovery.c b/src/playlist/services_discovery.c index d1b2993..aadee57 100644 --- a/src/playlist/services_discovery.c +++ b/src/playlist/services_discovery.c @@ -374,6 +374,29 @@ int playlist_ServicesDiscoveryAdd(playlist_t *playlist, const char *chain) return VLC_SUCCESS; } +static void playlist_ServicesDiscoveryInternalRemove(playlist_t *playlist, + vlc_sd_internal_t *sds) +{ + assert(sds->sd != NULL); + vlc_sd_Stop(sds->sd); + + 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 */ + playlist_Lock(playlist); + playlist_NodeDelete(playlist, sds->node, true, false); + playlist_Unlock(playlist); + + free(sds); +} + + int playlist_ServicesDiscoveryRemove(playlist_t *playlist, const char *name) { playlist_private_t *priv = pl_priv(playlist); @@ -399,25 +422,7 @@ int playlist_ServicesDiscoveryRemove(playlist_t *playlist, const char *name) return VLC_EGENERIC; } - assert(sds->sd != NULL); - - vlc_sd_Stop(sds->sd); - - 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 */ - playlist_Lock(playlist); - playlist_NodeDelete(playlist, sds->node, true, false); - playlist_Unlock(playlist); - - free(sds); - + playlist_ServicesDiscoveryInternalRemove(playlist, sds); return VLC_SUCCESS; } @@ -468,11 +473,12 @@ int playlist_ServicesDiscoveryControl( playlist_t *p_playlist, const char *psz_n return i_ret; } -void playlist_ServicesDiscoveryKillAll( playlist_t *p_playlist ) +void playlist_ServicesDiscoveryKillAll(playlist_t *playlist) { - playlist_private_t *priv = pl_priv( p_playlist ); + playlist_private_t *priv = pl_priv(playlist); + + for (int i = 0; i < priv->i_sds; i++) + playlist_ServicesDiscoveryInternalRemove(playlist, priv->pp_sds[i]); - while( priv->i_sds > 0 ) - playlist_ServicesDiscoveryRemove(p_playlist, - priv->pp_sds[0]->name); + TAB_CLEAN(priv->i_sds, priv->pp_sds); } _______________________________________________ vlc-commits mailing list vlc-commits@videolan.org https://mailman.videolan.org/listinfo/vlc-commits