Fix screensaver deadlock if terminating as soon the interface is created - closes...
authorRémi Denis-Courmont <rem@videolan.org>
Wed, 28 Nov 2007 17:50:22 +0000 (17:50 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Wed, 28 Nov 2007 17:50:22 +0000 (17:50 +0000)
include/vlc_objects.h
modules/misc/screensaver.c
src/libvlc.sym
src/misc/objects.c

index 348e56d..7da1112 100644 (file)
@@ -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 );
index d70fa2e..c2d76af 100644 (file)
@@ -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 );
 
index e55a318..4e64b62 100644 (file)
@@ -17,6 +17,7 @@ NTPtime64
 __str_format
 path_sanitize
 __vlc_object_kill
+__vlc_object_alive
 vlc_b64_encode
 __net_Connect
 __net_ConnectDgram
index 79a64d2..695b8e7 100644 (file)
@@ -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.
  */