[vlc-commits] Remove libvlc_InternalWait() and simplify

Rémi Denis-Courmont git at videolan.org
Mon May 7 18:58:19 CEST 2012


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon May  7 19:24:05 2012 +0300| [4e1d5325e9731aa3c4817a067fc66e19d41da341] | committer: Rémi Denis-Courmont

Remove libvlc_InternalWait() and simplify

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=4e1d5325e9731aa3c4817a067fc66e19d41da341
---

 lib/core.c         |   14 ++++++++++++--
 src/libvlccore.sym |    1 -
 src/misc/exit.c    |   37 ++-----------------------------------
 3 files changed, 14 insertions(+), 38 deletions(-)

diff --git a/lib/core.c b/lib/core.c
index a340d11..a1a722a 100644
--- a/lib/core.c
+++ b/lib/core.c
@@ -136,10 +136,20 @@ void libvlc_set_exit_handler( libvlc_instance_t *p_i, void (*cb) (void *),
     libvlc_SetExitHandler( p_libvlc, cb, data );
 }
 
+static void libvlc_wait_wakeup( void *data )
+{
+    vlc_sem_post( data );
+}
+
 void libvlc_wait( libvlc_instance_t *p_i )
 {
-    libvlc_int_t *p_libvlc = p_i->p_libvlc_int;
-    libvlc_InternalWait( p_libvlc );
+    vlc_sem_t sem;
+
+    vlc_sem_init( &sem, 0 );
+    libvlc_set_exit_handler( p_i, libvlc_wait_wakeup, &sem );
+    vlc_sem_wait( &sem );
+    libvlc_set_exit_handler( p_i, NULL, NULL );
+    vlc_sem_destroy( &sem );
 }
 
 void libvlc_set_user_agent (libvlc_instance_t *p_i,
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 71b984b..faa6182 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -225,7 +225,6 @@ libvlc_InternalCleanup
 libvlc_InternalCreate
 libvlc_InternalDestroy
 libvlc_InternalInit
-libvlc_InternalWait
 libvlc_Quit
 libvlc_SetExitHandler
 make_URI
diff --git a/src/misc/exit.c b/src/misc/exit.c
index ed02af7..9667bd4 100644
--- a/src/misc/exit.c
+++ b/src/misc/exit.c
@@ -43,9 +43,6 @@ void vlc_ExitDestroy( vlc_exit_t *exit )
 
 /**
  * Registers a callback for the LibVLC exit event.
- *
- * @note This function conflicts with libvlc_InternalWait().
- * Use either or none of them, but not both.
  */
 void libvlc_SetExitHandler( libvlc_int_t *p_libvlc, void (*handler) (void *),
                             void *opaque )
@@ -53,7 +50,7 @@ void libvlc_SetExitHandler( libvlc_int_t *p_libvlc, void (*handler) (void *),
     vlc_exit_t *exit = &libvlc_priv( p_libvlc )->exit;
 
     vlc_mutex_lock( &exit->lock );
-    if( exit->killed ) /* already exited! (race condition) */
+    if( exit->killed && handler != NULL ) /* already exited (race condition) */
         handler( opaque );
     exit->handler = handler;
     exit->opaque = opaque;
@@ -61,8 +58,7 @@ void libvlc_SetExitHandler( libvlc_int_t *p_libvlc, void (*handler) (void *),
 }
 
 /**
- * Posts an exit signal to LibVLC instance. This only emits a notification to
- * the main thread. It might take a while before the actual cleanup occurs.
+ * Posts an exit signal to LibVLC instance.
  * This function should only be called on behalf of the user.
  */
 void libvlc_Quit( libvlc_int_t *p_libvlc )
@@ -79,32 +75,3 @@ void libvlc_Quit( libvlc_int_t *p_libvlc )
     }
     vlc_mutex_unlock( &exit->lock );
 }
-
-
-static void exit_wakeup( void *data )
-{
-    vlc_cond_signal( data );
-}
-
-/**
- * Waits until the LibVLC instance gets an exit signal.
- * This normally occurs when the user "exits" an interface plugin. But it can
- * also be triggered by the special vlc://quit item, the update checker, or
- * the playlist engine.
- */
-void libvlc_InternalWait( libvlc_int_t *p_libvlc )
-{
-    vlc_exit_t *exit = &libvlc_priv( p_libvlc )->exit;
-    vlc_cond_t wait;
-
-    vlc_cond_init( &wait );
-
-    vlc_mutex_lock( &exit->lock );
-    exit->handler = exit_wakeup;
-    exit->opaque = &wait;
-    while( !exit->killed )
-        vlc_cond_wait( &wait, &exit->lock );
-    vlc_mutex_unlock( &exit->lock );
-
-    vlc_cond_destroy( &wait );
-}



More information about the vlc-commits mailing list