From: RĂ©mi Denis-Courmont Date: Thu, 12 Jun 2008 19:01:16 +0000 (+0300) Subject: Remove services discovery tasks before the playlist X-Git-Tag: 0.9.0-test0~183 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=bd054d30866ab0144e0b0582e249184a8ea6506f;p=vlc Remove services discovery tasks before the playlist I assume nothing can ever try to add a new one once the interfaces have been destroyed. If not there is a race condition. --- diff --git a/src/libvlc.c b/src/libvlc.c index 9c60cab88c..24e391319d 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -950,6 +950,10 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } #endif + /* Remove all services discovery */ + msg_Dbg( p_libvlc, "removing all services discovery tasks" ); + playlist_ServicesDiscoveryKillAll( priv->p_playlist ); + /* Free playlist */ msg_Dbg( p_libvlc, "removing playlist" ); vlc_object_release( priv->p_playlist ); diff --git a/src/libvlc.h b/src/libvlc.h index 936b75c1e0..0964abdf27 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -247,6 +247,8 @@ static inline libvlc_priv_t *libvlc_priv (libvlc_int_t *libvlc) return (libvlc_priv_t *)(libvlc + 1); } +void playlist_ServicesDiscoveryKillAll( playlist_t *p_playlist ); + #define libvlc_stats( o ) (libvlc_priv((VLC_OBJECT(o))->p_libvlc)->b_stats) /** diff --git a/src/playlist/engine.c b/src/playlist/engine.c index 3ee5cb74be..94dda74e77 100644 --- a/src/playlist/engine.c +++ b/src/playlist/engine.c @@ -419,12 +419,8 @@ void playlist_LastLoop( playlist_t *p_playlist ) sout_DeleteInstance( p_sout ); #endif - while( p_playlist->i_sds ) - { - playlist_ServicesDiscoveryRemove( p_playlist, - p_playlist->pp_sds[0]->p_sd->psz_module ); - } - + /* Core should have terminated all SDs before the playlist */ + assert( p_playlist->i_sds == 0 ); playlist_MLDump( p_playlist ); PL_LOCK; diff --git a/src/playlist/services_discovery.c b/src/playlist/services_discovery.c index 6f3cda60de..4fb9ea3f43 100644 --- a/src/playlist/services_discovery.c +++ b/src/playlist/services_discovery.c @@ -430,3 +430,10 @@ bool playlist_IsServicesDiscoveryLoaded( playlist_t * p_playlist, return false; } +void playlist_ServicesDiscoveryKillAll( playlist_t *p_playlist ) +{ + while( p_playlist->i_sds > 0 ) + playlist_ServicesDiscoveryRemove( p_playlist, + p_playlist->pp_sds[0]->p_sd->psz_module ); +} +