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

Fix screensaver deadlock if terminating as soon the interface is created - closes #1363

parent cddeb8e7
...@@ -153,13 +153,17 @@ VLC_EXPORT( vlc_bool_t, __vlc_object_wait, ( vlc_object_t * ) ); ...@@ -153,13 +153,17 @@ VLC_EXPORT( vlc_bool_t, __vlc_object_wait, ( vlc_object_t * ) );
#define vlc_object_wait( obj ) \ #define vlc_object_wait( obj ) \
__vlc_object_wait( VLC_OBJECT( 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 static inline
vlc_bool_t __vlc_object_lock_and_wait( vlc_object_t *obj ) 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 ); 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 ); vlc_object_unlock( obj );
return b; return b;
} }
...@@ -187,4 +191,8 @@ VLC_EXPORT( void, __vlc_object_kill, ( vlc_object_t * ) ); ...@@ -187,4 +191,8 @@ VLC_EXPORT( void, __vlc_object_kill, ( vlc_object_t * ) );
#define vlc_object_kill(a) \ #define vlc_object_kill(a) \
__vlc_object_kill( VLC_OBJECT(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 ); int vlc_object_waitpipe( vlc_object_t *obj );
...@@ -171,13 +171,13 @@ static void Run( intf_thread_t *p_intf ) ...@@ -171,13 +171,13 @@ static void Run( intf_thread_t *p_intf )
p_intf->p_sys->p_connection = dbus_init( p_intf ); p_intf->p_sys->p_connection = dbus_init( p_intf );
#endif #endif
for(;;) while( vlc_object_alive( p_intf ) )
{ {
vlc_object_t *p_vout; vlc_object_t *p_vout;
/* Check screensaver every 30 seconds */ /* Check screensaver every 30 seconds */
if( vlc_object_timedwait( p_intf, mdate() + 30000000 ) < 0 ) if( vlc_object_timedwait( p_intf, mdate() + 30000000 ) < 0 )
break; continue;
p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); p_vout = vlc_object_find( p_intf, VLC_OBJECT_VOUT, FIND_ANYWHERE );
......
...@@ -17,6 +17,7 @@ NTPtime64 ...@@ -17,6 +17,7 @@ NTPtime64
__str_format __str_format
path_sanitize path_sanitize
__vlc_object_kill __vlc_object_kill
__vlc_object_alive
vlc_b64_encode vlc_b64_encode
__net_Connect __net_Connect
__net_ConnectDgram __net_ConnectDgram
......
...@@ -552,6 +552,36 @@ int __vlc_object_timedwait( vlc_object_t *obj, mtime_t deadline ) ...@@ -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. * Signals an object for which the lock is held.
*/ */
......
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