X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Flibvlc.c;h=1e62c1fdf1645a8acc2d0847069bf8c4d1bd2058;hb=31394757ade13be284ede28b3719116b88f7421a;hp=ec267bc42f66e9ffb267826456d4b9f4db6075cf;hpb=a62595b97ffddfb1e75827354ff56da227f44cad;p=vlc diff --git a/src/libvlc.c b/src/libvlc.c index ec267bc42f..1e62c1fdf1 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -197,6 +197,10 @@ libvlc_int_t * libvlc_InternalCreate( void ) vlc_mutex_init( &priv->timer_lock ); vlc_mutex_init( &priv->config_lock ); + priv->threads_count = 0; + vlc_mutex_init (&priv->threads_lock); + vlc_cond_init (NULL, &priv->threads_wait); + /* Store data for the non-reentrant API */ p_static_vlc = p_libvlc; @@ -577,7 +581,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if ( !dbus_message_iter_append_basic( &dbus_args, DBUS_TYPE_STRING, &ppsz_argv[i_input] ) ) { - msg_Err( p_libvlc, "Out of memory" ); dbus_message_unref( p_dbus_msg ); system_End( p_libvlc ); exit( VLC_ENOMEM ); @@ -588,7 +591,6 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, if ( !dbus_message_iter_append_basic( &dbus_args, DBUS_TYPE_BOOLEAN, &b_play ) ) { - msg_Err( p_libvlc, "Out of memory" ); dbus_message_unref( p_dbus_msg ); system_End( p_libvlc ); exit( VLC_ENOMEM ); @@ -897,8 +899,10 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, var_Create( p_libvlc, "volume-change", VLC_VAR_BOOL ); /* Create a variable for showing the interface (moved from playlist). */ - var_Create( p_playlist, "intf-show", VLC_VAR_BOOL ); - var_SetBool( p_playlist, "intf-show", true ); + var_Create( p_libvlc, "intf-show", VLC_VAR_BOOL ); + var_SetBool( p_libvlc, "intf-show", true ); + + var_Create( p_libvlc, "intf-popupmenu", VLC_VAR_BOOL ); /* * Get input filenames given as commandline arguments @@ -943,24 +947,6 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } #ifdef ENABLE_SOUT - playlist_t * p_playlist; - sout_instance_t * p_sout; - - p_playlist = vlc_object_find( p_libvlc, VLC_OBJECT_PLAYLIST, FIND_CHILD ); - if( p_playlist ) - { - p_sout = vlc_object_find( p_playlist, VLC_OBJECT_SOUT, FIND_CHILD ); - if( p_sout ) - { - msg_Dbg( p_sout, "removing kept stream output" ); - vlc_object_detach( (vlc_object_t*)p_sout ); - vlc_object_release( (vlc_object_t*)p_sout ); - sout_DeleteInstance( p_sout ); - } - - vlc_object_release( p_playlist ); - } - /* Destroy VLM if created in libvlc_InternalInit */ if( priv->p_vlm ) { @@ -968,6 +954,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 ); @@ -1002,6 +992,17 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) } #endif + /* Make sure all threads are completed before we start looking for + * reference leaks and deinitializing core LibVLC subsytems. */ + vlc_mutex_lock (&priv->threads_lock); + while (priv->threads_count) + { + msg_Dbg (p_libvlc, "waiting for %u remaining threads", + priv->threads_count); + vlc_cond_wait (&priv->threads_wait, &priv->threads_lock); + } + vlc_mutex_unlock (&priv->threads_lock); + bool b_clean = true; FOREACH_ARRAY( input_item_t *p_del, priv->input_items ) msg_Err( p_libvlc, "input item %p has not been deleted properly: refcount %d, name %s", @@ -1024,9 +1025,8 @@ int libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) * termination, and destroys their structure. * It stops the thread systems: no instance can run after this has run * \param p_libvlc the instance to destroy - * \param b_release whether we should do a release on the instance */ -int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) +int libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) { if( !p_libvlc ) return VLC_EGENERIC; @@ -1082,8 +1082,9 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc, bool b_release ) /* Destroy mutexes */ vlc_mutex_destroy( &priv->config_lock ); vlc_mutex_destroy( &priv->timer_lock ); + vlc_cond_destroy (&priv->threads_wait); + vlc_mutex_destroy (&priv->threads_lock); - if( b_release ) vlc_object_release( p_libvlc ); vlc_object_release( p_libvlc ); p_libvlc = NULL; @@ -1133,7 +1134,6 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) } /* Try to run the interface */ - p_intf->b_play = false; /* TODO: remove b_play completely */ i_err = intf_RunThread( p_intf ); if( i_err ) { @@ -1347,9 +1347,10 @@ static void Usage( libvlc_int_t *p_this, char const *psz_module_name ) psz_spaces_text[PADDING_SPACES+LINE_START] = '\0'; memset( psz_spaces_longtext, ' ', LINE_START+2 ); psz_spaces_longtext[LINE_START+2] = '\0'; -#ifdef WIN32 - b_color = false; // don't put color control codes in a .txt file +#ifndef WIN32 + if( !isatty( 1 ) ) #endif + b_color = false; // don't put color control codes in a .txt file if( b_color ) {