From: RĂ©mi Denis-Courmont Date: Wed, 28 Nov 2007 17:50:22 +0000 (+0000) Subject: Fix screensaver deadlock if terminating as soon the interface is created - closes... X-Git-Tag: 0.9.0-test0~4335 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=b8acb755a7459323e2cd9a0b0e5c49a7eac55b0c;p=vlc Fix screensaver deadlock if terminating as soon the interface is created - closes #1363 --- diff --git a/include/vlc_objects.h b/include/vlc_objects.h index 348e56d0f7..7da1112926 100644 --- a/include/vlc_objects.h +++ b/include/vlc_objects.h @@ -153,13 +153,17 @@ VLC_EXPORT( vlc_bool_t, __vlc_object_wait, ( vlc_object_t * ) ); #define vlc_object_wait( obj ) \ __vlc_object_wait( VLC_OBJECT( obj ) ) +/* NOTE: this function is a *temporary* convenience. + * See the vlc_object_alive() documentation for a better alternative. + */ static inline vlc_bool_t __vlc_object_lock_and_wait( vlc_object_t *obj ) { - vlc_bool_t b; + vlc_bool_t b = VLC_TRUE; vlc_object_lock( obj ); - b = obj->b_die ? VLC_TRUE : vlc_object_wait( obj ); + if( vlc_object_alive( obj ) ) + b = vlc_object_wait( obj ); vlc_object_unlock( obj ); return b; } @@ -187,4 +191,8 @@ VLC_EXPORT( void, __vlc_object_kill, ( vlc_object_t * ) ); #define vlc_object_kill(a) \ __vlc_object_kill( VLC_OBJECT(a) ) +VLC_EXPORT( vlc_bool_t, __vlc_object_alive, ( vlc_object_t * ) ); +#define vlc_object_alive(a) \ + __vlc_object_alive( VLC_OBJECT(a) ) + int vlc_object_waitpipe( vlc_object_t *obj ); diff --git a/modules/misc/screensaver.c b/modules/misc/screensaver.c index d70fa2e286..c2d76afc9d 100644 --- a/modules/misc/screensaver.c +++ b/modules/misc/screensaver.c @@ -171,13 +171,13 @@ static void Run( intf_thread_t *p_intf ) p_intf->p_sys->p_connection = dbus_init( p_intf ); #endif - for(;;) + while( vlc_object_alive( p_intf ) ) { vlc_object_t *p_vout; /* Check screensaver every 30 seconds */ if( vlc_object_timedwait( p_intf, mdate() + 30000000 ) < 0 ) - break; + continue; p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); diff --git a/src/libvlc.sym b/src/libvlc.sym index e55a318921..4e64b62434 100644 --- a/src/libvlc.sym +++ b/src/libvlc.sym @@ -17,6 +17,7 @@ NTPtime64 __str_format path_sanitize __vlc_object_kill +__vlc_object_alive vlc_b64_encode __net_Connect __net_ConnectDgram diff --git a/src/misc/objects.c b/src/misc/objects.c index 79a64d203b..695b8e7086 100644 --- a/src/misc/objects.c +++ b/src/misc/objects.c @@ -552,6 +552,36 @@ int __vlc_object_timedwait( vlc_object_t *obj, mtime_t deadline ) } +/** + * Checks whether an object has been "killed". + * The object lock must be held. + * + * Typical code for an object thread could be: + * + vlc_object_lock (self); + ...initialization... + while (vlc_object_alive (self)) + { + ...preprocessing... + + if (vlc_object_wait (self)) + continue; + + ...postprocessing... + } + ...deinitialization... + vlc_object_unlock (self); + * + * + * @return true iff the object has not been killed yet + */ +vlc_bool_t __vlc_object_alive( vlc_object_t *obj ) +{ + vlc_assert_locked( &obj->object_lock ); + return !obj->b_die; +} + + /** * Signals an object for which the lock is held. */