Commit 484b0aa1 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

libvlc_InternalWait, libvlc_Quit: wait and signal libvlc exit

parent 73ec91d4
...@@ -106,6 +106,8 @@ VLC_EXPORT( void, intf_StopThread, ( intf_thread_t * ) ); ...@@ -106,6 +106,8 @@ VLC_EXPORT( void, intf_StopThread, ( intf_thread_t * ) );
#define intf_Eject(a,b) __intf_Eject(VLC_OBJECT(a),b) #define intf_Eject(a,b) __intf_Eject(VLC_OBJECT(a),b)
VLC_EXPORT( int, __intf_Eject, ( vlc_object_t *, const char * ) ); 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_Register, ( intf_thread_t * ) );
VLC_EXPORT( int, interaction_Unregister, ( intf_thread_t * ) ); VLC_EXPORT( int, interaction_Unregister, ( intf_thread_t * ) );
......
...@@ -45,6 +45,7 @@ VLC_EXPORT (void, libvlc_InternalCleanup, ( libvlc_int_t * ) ); ...@@ -45,6 +45,7 @@ VLC_EXPORT (void, libvlc_InternalCleanup, ( libvlc_int_t * ) );
VLC_EXPORT (void, libvlc_InternalDestroy, ( libvlc_int_t * ) ); VLC_EXPORT (void, libvlc_InternalDestroy, ( libvlc_int_t * ) );
VLC_EXPORT (int, libvlc_InternalAddIntf, ( libvlc_int_t *, const char * ) ); VLC_EXPORT (int, libvlc_InternalAddIntf, ( libvlc_int_t *, const char * ) );
VLC_EXPORT (void, libvlc_InternalWait, ( libvlc_int_t * ) );
/*************************************************************************** /***************************************************************************
* Opaque structures for libvlc API * Opaque structures for libvlc API
......
...@@ -283,6 +283,7 @@ libvlc_int_t * libvlc_InternalCreate( void ) ...@@ -283,6 +283,7 @@ libvlc_int_t * libvlc_InternalCreate( void )
/* Initialize mutexes */ /* Initialize mutexes */
vlc_mutex_init( &priv->timer_lock ); vlc_mutex_init( &priv->timer_lock );
vlc_mutex_init( &priv->config_lock ); vlc_mutex_init( &priv->config_lock );
vlc_cond_init( &priv->exiting );
return p_libvlc; return p_libvlc;
} }
...@@ -1135,6 +1136,7 @@ void libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) ...@@ -1135,6 +1136,7 @@ void libvlc_InternalDestroy( libvlc_int_t *p_libvlc )
msg_Destroy( p_libvlc ); msg_Destroy( p_libvlc );
/* Destroy mutexes */ /* Destroy mutexes */
vlc_cond_destroy( &priv->exiting );
vlc_mutex_destroy( &priv->config_lock ); vlc_mutex_destroy( &priv->config_lock );
vlc_mutex_destroy( &priv->timer_lock ); vlc_mutex_destroy( &priv->timer_lock );
...@@ -1190,6 +1192,33 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module ) ...@@ -1190,6 +1192,33 @@ int libvlc_InternalAddIntf( libvlc_int_t *p_libvlc, char const *psz_module )
return VLC_SUCCESS; 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)) && \ #if defined( ENABLE_NLS ) && (defined (__APPLE__) || defined (WIN32)) && \
( defined( HAVE_GETTEXT ) || defined( HAVE_INCLUDED_GETTEXT ) ) ( defined( HAVE_GETTEXT ) || defined( HAVE_INCLUDED_GETTEXT ) )
/***************************************************************************** /*****************************************************************************
......
...@@ -198,6 +198,7 @@ typedef struct sap_handler_t sap_handler_t; ...@@ -198,6 +198,7 @@ typedef struct sap_handler_t sap_handler_t;
typedef struct libvlc_priv_t typedef struct libvlc_priv_t
{ {
libvlc_int_t public_data; libvlc_int_t public_data;
vlc_cond_t exiting; ///< signaled when VLC wants to exit
/* Configuration */ /* Configuration */
vlc_mutex_t config_lock; ///< config file lock vlc_mutex_t config_lock; ///< config file lock
......
...@@ -208,6 +208,8 @@ libvlc_InternalCleanup ...@@ -208,6 +208,8 @@ libvlc_InternalCleanup
libvlc_InternalCreate libvlc_InternalCreate
libvlc_InternalDestroy libvlc_InternalDestroy
libvlc_InternalInit libvlc_InternalInit
libvlc_InternalWait
libvlc_Quit
LocaleFree LocaleFree
mdate mdate
module_config_free module_config_free
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment