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

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 * ) );
#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 );
......@@ -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 );
......
......@@ -17,6 +17,7 @@ NTPtime64
__str_format
path_sanitize
__vlc_object_kill
__vlc_object_alive
vlc_b64_encode
__net_Connect
__net_ConnectDgram
......
......@@ -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.
*/
......
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