]> git.sesse.net Git - vlc/commitdiff
Mac OS X gui: Make sure we don't end up with a freed p_input.
authorPierre d'Herbemont <pdherbemont@videolan.org>
Fri, 9 Mar 2007 23:03:43 +0000 (23:03 +0000)
committerPierre d'Herbemont <pdherbemont@videolan.org>
Fri, 9 Mar 2007 23:03:43 +0000 (23:03 +0000)
modules/gui/macosx/intf.m

index 58bd0a811d1a96c4bf470fa7ba3e02acef94e498..e0bfcb27b8c98534e5b2d67e0b467d0f6d80213c 100644 (file)
@@ -1116,12 +1116,15 @@ static VLCMain *_o_sharedMainInstance = nil;
         playlist_t * p_playlist = pl_Yield( p_intf );
        /** \todo fix i_size use */
         b_plmul = p_playlist->items.i_size > 1;
+        PL_LOCK;
         p_input = p_playlist->p_input;
+        if( p_input )
+            vlc_object_yield( p_input );
+        PL_UNLOCK;
 
         if( ( b_input = ( p_input != NULL ) ) )
         {
             /* seekable streams */
-            vlc_object_yield( p_input );
             b_seekable = var_GetBool( p_input, "seekable" );
 
             /* check wether slow/fast motion is possible*/
@@ -1175,12 +1178,15 @@ static VLCMain *_o_sharedMainInstance = nil;
     }
 
     p_playlist = pl_Yield( p_intf );
+    PL_LOCK;
     p_input = p_playlist->p_input;
+    if( p_input )
+        vlc_object_yield( p_input );
+    PL_UNLOCK;
 
     if( p_input && !p_input->b_die )
     {
         vlc_value_t val;
-        vlc_object_yield( p_input );
 
         if( p_intf->p_sys->b_current_title_update )
         {
@@ -1254,7 +1260,6 @@ static VLCMain *_o_sharedMainInstance = nil;
             [self playStatusUpdated: p_intf->p_sys->i_play_status];
             [o_embedded_window playStatusUpdated: p_intf->p_sys->i_play_status];
         }
-        vlc_object_release( p_input );
     }
     else
     {
@@ -1264,6 +1269,8 @@ static VLCMain *_o_sharedMainInstance = nil;
         [o_embedded_window playStatusUpdated: p_intf->p_sys->i_play_status];
         [self setSubmenusEnabled: FALSE];
     }
+    if( p_input )
+        vlc_object_release( p_input );
     vlc_object_release( p_playlist );
 
     [self updateMessageArray];
@@ -1279,10 +1286,15 @@ static VLCMain *_o_sharedMainInstance = nil;
 - (void)setupMenus
 {
     playlist_t * p_playlist = pl_Yield( p_intf );
-    input_thread_t * p_input = p_playlist->p_input;
+    input_thread_t * p_input;
+    PL_LOCK;
+    p_input = p_playlist->p_input;
+    if( p_input )
+        vlc_object_yield( p_input );
+    PL_UNLOCK;
+
     if( p_input != NULL )
     {
-        vlc_object_yield( p_input );
         [o_controls setupVarMenuItem: o_mi_program target: (vlc_object_t *)p_input
             var: "program" selector: @selector(toggleVar:)];
 
@@ -1393,13 +1405,17 @@ static VLCMain *_o_sharedMainInstance = nil;
 - (void)resetScrollField
 {
     playlist_t * p_playlist = pl_Yield( p_intf );
-    input_thread_t * p_input = p_playlist->p_input;
+    input_thread_t * p_input;
+    PL_LOCK;
+    p_input = p_playlist->p_input;
+    if( p_input )
+        vlc_object_yield( p_input );
+    PL_UNLOCK;
 
     i_end_scroll = -1;
     if( p_input && !p_input->b_die )
     {
         NSString *o_temp;
-        vlc_object_yield( p_input );
         o_temp = [NSString stringWithUTF8String:
                   p_playlist->status.p_item->p_input->psz_name];
         if( o_temp == NULL )
@@ -1410,6 +1426,8 @@ static VLCMain *_o_sharedMainInstance = nil;
         vlc_object_release( p_playlist );
         return;
     }
+    if( p_input )
+        vlc_object_release( p_input );
     vlc_object_release( p_playlist );
     [self setScrollField: _NS("VLC media player") stopAfter:-1];
 }
@@ -1550,14 +1568,18 @@ static VLCMain *_o_sharedMainInstance = nil;
             return;
     }
     p_playlist = pl_Yield( p_intf );
+    PL_LOCK;
     p_input = p_playlist->p_input;
+    if( p_input )
+        vlc_object_yield( p_input );
+    PL_UNLOCK;
+
     if( p_input != NULL )
     {
         vlc_value_t time;
         vlc_value_t pos;
         mtime_t i_seconds;
         NSString * o_time;
-        vlc_object_yield( p_input );
 
         pos.f_float = f_updated / 10000.;
         var_Set( p_input, "position", pos );