[vlc-devel] commit: libvlc_InternalWait, libvlc_Quit: wait and signal libvlc exit ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sat Jan 24 19:57:56 CET 2009
vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Sat Jan 24 20:21:57 2009 +0200| [484b0aa1c49b322bd52b41f2ad4a535961673557] | committer: Rémi Denis-Courmont
libvlc_InternalWait, libvlc_Quit: wait and signal libvlc exit
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=484b0aa1c49b322bd52b41f2ad4a535961673557
---
include/vlc_interface.h | 2 ++
src/control/libvlc_internal.h | 1 +
src/libvlc.c | 29 +++++++++++++++++++++++++++++
src/libvlc.h | 1 +
src/libvlccore.sym | 2 ++
5 files changed, 35 insertions(+), 0 deletions(-)
diff --git a/include/vlc_interface.h b/include/vlc_interface.h
index 056167a..ee09b2d 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 a7520d2..2fcc51b 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 0114be6..ecfd6f0 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 a9c74d3..c9330e9 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 f8275b9..a6ed45e 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
More information about the vlc-devel
mailing list