[vlc-devel] commit: dbus: fix another locking problem. ( Rémi Duraffort )

git version control git at videolan.org
Sat Mar 21 08:59:50 CET 2009


vlc | branch: master | Rémi Duraffort <ivoire at videolan.org> | Sat Mar 21 08:54:39 2009 +0100| [cccd154d86cbf26348603534f20b80472d39d81e] | committer: Rémi Duraffort 

dbus: fix another locking problem.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cccd154d86cbf26348603534f20b80472d39d81e
---

 modules/control/dbus.c |   52 +++++++++++++++++++++++++++++++----------------
 1 files changed, 34 insertions(+), 18 deletions(-)

diff --git a/modules/control/dbus.c b/modules/control/dbus.c
index a007daf..c86e918 100644
--- a/modules/control/dbus.c
+++ b/modules/control/dbus.c
@@ -65,9 +65,7 @@ static int  Open    ( vlc_object_t * );
 static void Close   ( vlc_object_t * );
 static void Run     ( intf_thread_t * );
 
-static int StateChange( vlc_object_t *, const char *, vlc_value_t,
-                        vlc_value_t, void * );
-
+static int StateChange( intf_thread_t *, int );
 static int TrackChange( intf_thread_t * );
 static int StatusChangeEmit( intf_thread_t *);
 static int TrackListChangeEmit( intf_thread_t *, int, int );
@@ -118,6 +116,7 @@ typedef struct
 {
     int signal;
     int i_node;
+    int i_input_state;
 } callback_info_t;
 
 
@@ -808,7 +807,7 @@ static void Close   ( vlc_object_t *p_this )
     p_input = playlist_CurrentInput( p_playlist );
     if ( p_input )
     {
-        var_DelCallback( p_input, "state", StateChange, p_intf );
+        var_DelCallback( p_input, "state", AllCallback, p_intf );
         vlc_object_release( p_input );
     }
 
@@ -853,6 +852,9 @@ static void Run          ( intf_thread_t *p_intf )
             case SIGNAL_LOOP:
                 StatusChangeEmit( p_intf );
                 break;
+            case SIGNAL_STATE:
+                StateChange( p_intf, info->i_input_state );
+                break;
             default:
                 assert(0);
             }
@@ -895,6 +897,11 @@ static int AllCallback( vlc_object_t *p_this, const char *psz_var,
         info->signal = SIGNAL_REPEAT;
     else if( !strcmp( "loop", psz_var ) )
         info->signal = SIGNAL_LOOP;
+    else if( !strcmp( "state", psz_var ) )
+    {
+        info->signal = SIGNAL_STATE;
+        info->i_input_state = newval.i_int;
+    }
     else
         assert(0);
 
@@ -1000,32 +1007,41 @@ DBUS_SIGNAL( StatusChangeSignal )
 /*****************************************************************************
  * StateChange: callback on input "state"
  *****************************************************************************/
-static int StateChange( vlc_object_t *p_this, const char* psz_var,
-            vlc_value_t oldval, vlc_value_t newval, void *p_data )
+//static int StateChange( vlc_object_t *p_this, const char* psz_var,
+//            vlc_value_t oldval, vlc_value_t newval, void *p_data )
+static int StateChange( intf_thread_t *p_intf, int i_input_state )
 {
-    VLC_UNUSED(psz_var); VLC_UNUSED(oldval);
-    intf_thread_t       *p_intf     = ( intf_thread_t* ) p_data;
     intf_sys_t          *p_sys      = p_intf->p_sys;
+    playlist_t          *p_playlist;
+    input_thread_t      *p_input;
+    input_item_t        *p_item;
 
     if( p_intf->p_sys->b_dead )
         return VLC_SUCCESS;
 
-    UpdateCaps( p_intf, true );
+    UpdateCaps( p_intf, pl_Unlocked );
 
-    if( !p_sys->b_meta_read && newval.i_int == PLAYING_S )
+    if( !p_sys->b_meta_read && i_input_state == PLAYING_S )
     {
-        input_item_t *p_item = input_GetItem( (input_thread_t*)p_this );
-        if( p_item )
+        p_playlist = pl_Hold( p_intf );
+        p_input = playlist_CurrentInput( p_playlist );
+        if( p_input )
         {
-            p_sys->b_meta_read = true;
-            TrackChangeSignal( p_sys->p_conn, p_item );
+            p_item = input_GetItem( p_input );
+            if( p_item )
+            {
+                p_sys->b_meta_read = true;
+                TrackChangeSignal( p_sys->p_conn, p_item );
+            }
+            vlc_object_release( p_input );
         }
+        pl_Release( p_intf );
     }
 
-    if( newval.i_int == PLAYING_S || newval.i_int == PAUSE_S ||
-        newval.i_int == END_S )
+    if( i_input_state == PLAYING_S || i_input_state == PAUSE_S ||
+        i_input_state == END_S )
     {
-        StatusChangeSignal( p_sys->p_conn, (void*) p_intf );
+        StatusChangeSignal( p_sys->p_conn, p_intf );
     }
 
     return VLC_SUCCESS;
@@ -1082,7 +1098,7 @@ static int TrackChange( intf_thread_t *p_intf )
         TrackChangeSignal( p_sys->p_conn, p_item );
     }
 
-    var_AddCallback( p_input, "state", StateChange, p_intf );
+    var_AddCallback( p_input, "state", AllCallback, p_intf );
 
     vlc_object_release( p_input );
     return VLC_SUCCESS;




More information about the vlc-devel mailing list