From: RĂ©mi Denis-Courmont Date: Sat, 24 Jan 2009 18:21:57 +0000 (+0200) Subject: libvlc_InternalWait, libvlc_Quit: wait and signal libvlc exit X-Git-Tag: 1.0.0-pre1~1075 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=484b0aa1c49b322bd52b41f2ad4a535961673557;p=vlc libvlc_InternalWait, libvlc_Quit: wait and signal libvlc exit --- diff --git a/include/vlc_interface.h b/include/vlc_interface.h index 056167a548..ee09b2d905 100644 --- a/include/vlc_interface.h +++ b/include/vlc_interface.h @@ -106,6 +106,8 @@ VLC_EXPORT( void, intf_StopThread, ( intf_thread_t * ) ); #define intf_Eject(a,b) __intf_Eject(VLC_OBJECT(a),b) VLC_EXPORT( int, __intf_Eject, ( vlc_object_t *, const char * ) ); +VLC_EXPORT( void, libvlc_Quit, ( libvlc_int_t * ) ); + VLC_EXPORT( int, interaction_Register, ( intf_thread_t * ) ); VLC_EXPORT( int, interaction_Unregister, ( intf_thread_t * ) ); diff --git a/src/control/libvlc_internal.h b/src/control/libvlc_internal.h index a7520d28be..2fcc51b939 100644 --- a/src/control/libvlc_internal.h +++ b/src/control/libvlc_internal.h @@ -45,6 +45,7 @@ VLC_EXPORT (void, libvlc_InternalCleanup, ( libvlc_int_t * ) ); VLC_EXPORT (void, libvlc_InternalDestroy, ( libvlc_int_t * ) ); VLC_EXPORT (int, libvlc_InternalAddIntf, ( libvlc_int_t *, const char * ) ); +VLC_EXPORT (void, libvlc_InternalWait, ( libvlc_int_t * ) ); /*************************************************************************** * Opaque structures for libvlc API diff --git a/src/libvlc.c b/src/libvlc.c index 0114be64ef..ecfd6f0bd6 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -283,6 +283,7 @@ libvlc_int_t * libvlc_InternalCreate( void ) /* Initialize mutexes */ vlc_mutex_init( &priv->timer_lock ); vlc_mutex_init( &priv->config_lock ); + vlc_cond_init( &priv->exiting ); return p_libvlc; } @@ -1135,6 +1136,7 @@ void libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) msg_Destroy( p_libvlc ); /* Destroy mutexes */ + vlc_cond_destroy( &priv->exiting ); vlc_mutex_destroy( &priv->config_lock ); vlc_mutex_destroy( &priv->timer_lock ); @@ -1190,6 +1192,33 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) return VLC_SUCCESS; }; +/** + * Waits until the LibVLC instance gets an exit signal. Normally, this happens + * when the user "exits" an interface plugin. + */ +void libvlc_InternalWait( libvlc_int_t *p_libvlc ) +{ + libvlc_priv_t *priv = libvlc_priv( p_libvlc ); + vlc_object_internals_t *internals = vlc_internals( p_libvlc ); + + vlc_object_lock( p_libvlc ); + while( vlc_object_alive( p_libvlc ) ) + vlc_cond_wait( &priv->exiting, &internals->lock ); + vlc_object_unlock( p_libvlc ); +} + +/** + * Posts an exit signal to LibVLC instance. This will normally initiate the + * cleanup and destroy process. It should only be called on behalf of the user. + */ +void libvlc_Quit( libvlc_int_t *p_libvlc ) +{ + libvlc_priv_t *priv = libvlc_priv( p_libvlc ); + + vlc_object_kill( p_libvlc ); + vlc_cond_signal( &priv->exiting ); /* OK, kill took care of the lock */ +} + #if defined( ENABLE_NLS ) && (defined (__APPLE__) || defined (WIN32)) && \ ( defined( HAVE_GETTEXT ) || defined( HAVE_INCLUDED_GETTEXT ) ) /***************************************************************************** diff --git a/src/libvlc.h b/src/libvlc.h index a9c74d39ce..c9330e9b20 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -198,6 +198,7 @@ typedef struct sap_handler_t sap_handler_t; typedef struct libvlc_priv_t { libvlc_int_t public_data; + vlc_cond_t exiting; ///< signaled when VLC wants to exit /* Configuration */ vlc_mutex_t config_lock; ///< config file lock diff --git a/src/libvlccore.sym b/src/libvlccore.sym index f8275b9919..a6ed45edb6 100644 --- a/src/libvlccore.sym +++ b/src/libvlccore.sym @@ -208,6 +208,8 @@ libvlc_InternalCleanup libvlc_InternalCreate libvlc_InternalDestroy libvlc_InternalInit +libvlc_InternalWait +libvlc_Quit LocaleFree mdate module_config_free