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,
/**
* 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 )
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;
}
/**
- * 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 )
}
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 );
-}