]> git.sesse.net Git - vlc/commitdiff
add vlc_object_lock/unlock to playlist-handling, fixes locking_assert for me
authorIlkka Ollakka <ileoo@videolan.org>
Wed, 23 Jul 2008 12:34:27 +0000 (15:34 +0300)
committerIlkka Ollakka <ileoo@videolan.org>
Wed, 23 Jul 2008 12:35:29 +0000 (15:35 +0300)
in lua-http interface, but if someone could double check it would be nice.

modules/misc/lua/demux.c
modules/misc/lua/libs/input.c
modules/misc/lua/libs/objects.c
modules/misc/lua/libs/playlist.c
modules/misc/lua/libs/playlist.h
modules/misc/lua/libs/sd.c

index db030fe3956d9558324d34e05d8e4fac68f1857d..8561aecf232a85189d6303cd0a147946c6ae242a 100644 (file)
@@ -276,7 +276,7 @@ static int Demux( demux_t *p_demux )
         msg_Err( p_demux, "Script went completely foobar" );
 
     vlc_object_release( p_input_thread );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
 
     return -1; /* Needed for correct operation of go back */
 }
index 7eab977ea7464995d8c87c561e10df4e961d9a21..7b2da567a382175a5fa3eb75fad8e3aaa7692479 100644 (file)
 input_thread_t * vlclua_get_input_internal( lua_State *L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
+    vlc_object_lock( p_playlist );
     input_thread_t *p_input = p_playlist->p_input;
     if( p_input ) vlc_object_yield( p_input );
-    pl_Release( p_playlist );
+    vlc_object_unlock( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return p_input;
 }
 
 static int vlclua_input_info( lua_State *L )
 {
     input_thread_t * p_input = vlclua_get_input_internal( L );
+    vlc_object_lock( p_input );
     int i_cat;
     int i;
     if( !p_input ) return vlclua_error( L );
@@ -80,7 +83,8 @@ static int vlclua_input_info( lua_State *L )
         }
         lua_settable( L, -3 );
     }
-    //vlc_object_release( p_input );
+    vlc_object_unlock( p_input );
+    vlc_object_release( p_input );
     return 1;
 }
 
index 0452204972a600469aa9ae8c2e921d5b7bd71179..72638f9a9d123fe0706b9df35bc738f3a4d6442e 100644 (file)
@@ -207,6 +207,7 @@ static int vlclua_get_playlist( lua_State *L )
         vlclua_push_vlc_object( L, p_playlist, vlclua_gc_release );
     }
     else lua_pushnil( L );
+    //vlclua_release_playlist_internal( p_playlist );
     return 1;
 }
 
index 04cdfc459198b3ed77e2939ec3c5ff60effa431e..067e30008bcf64fdad4ee15e995566e1d9f1a929 100644 (file)
@@ -54,11 +54,16 @@ playlist_t *vlclua_get_playlist_internal( lua_State *L )
     return pl_Yield( p_this );
 }
 
+void vlclua_release_playlist_internal( playlist_t *p_playlist )
+{
+    pl_Release( p_playlist );
+}
+
 static int vlclua_playlist_prev( lua_State * L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     playlist_Prev( p_playlist );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 0;
 }
 
@@ -66,7 +71,7 @@ static int vlclua_playlist_next( lua_State * L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     playlist_Next( p_playlist );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 0;
 }
 
@@ -75,15 +80,17 @@ static int vlclua_playlist_skip( lua_State * L )
     int i_skip = luaL_checkint( L, 1 );
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     playlist_Skip( p_playlist, i_skip );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 0;
 }
 
 static int vlclua_playlist_play( lua_State * L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
+    vlc_object_lock( p_playlist );
     playlist_Play( p_playlist );
-    pl_Release( p_playlist );
+    vlc_object_unlock( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 0;
 }
 
@@ -91,7 +98,7 @@ static int vlclua_playlist_pause( lua_State * L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     playlist_Pause( p_playlist );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 0;
 }
 
@@ -99,7 +106,7 @@ static int vlclua_playlist_stop( lua_State * L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     playlist_Stop( p_playlist );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 0;
 }
 
@@ -108,7 +115,7 @@ static int vlclua_playlist_clear( lua_State * L )
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     playlist_Stop( p_playlist ); /* Isn't this already implied by Clear? */
     playlist_Clear( p_playlist, pl_Unlocked );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 0;
 }
 
@@ -116,7 +123,7 @@ static int vlclua_playlist_repeat( lua_State * L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     int i_ret = vlclua_var_toggle_or_set( L, p_playlist, "repeat" );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return i_ret;
 }
 
@@ -124,7 +131,7 @@ static int vlclua_playlist_loop( lua_State * L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     int i_ret = vlclua_var_toggle_or_set( L, p_playlist, "loop" );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return i_ret;
 }
 
@@ -132,7 +139,7 @@ static int vlclua_playlist_random( lua_State * L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     int i_ret = vlclua_var_toggle_or_set( L, p_playlist, "random" );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return i_ret;
 }
 
@@ -140,11 +147,13 @@ static int vlclua_playlist_goto( lua_State * L )
 {
     int i_id = luaL_checkint( L, 1 );
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
+    vlc_object_lock( p_playlist );
     int i_ret = playlist_Control( p_playlist, PLAYLIST_VIEWPLAY,
                                   true, NULL,
                                   playlist_ItemGetById( p_playlist, i_id,
                                                         true ) );
-    pl_Release( p_playlist );
+    vlc_object_unlock( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return vlclua_push_ret( L, i_ret );
 }
 
@@ -155,7 +164,7 @@ static int vlclua_playlist_add( lua_State *L )
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     i_count = vlclua_playlist_add_internal( p_this, L, p_playlist,
                                             NULL, true );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     lua_pushinteger( L, i_count );
     return 1;
 }
@@ -167,7 +176,7 @@ static int vlclua_playlist_enqueue( lua_State *L )
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     i_count = vlclua_playlist_add_internal( p_this, L, p_playlist,
                                             NULL, false );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     lua_pushinteger( L, i_count );
     return 1;
 }
@@ -176,7 +185,8 @@ static void push_playlist_item( lua_State *L, playlist_item_t *p_item );
 static void push_playlist_item( lua_State *L, playlist_item_t *p_item )
 {
     input_item_t *p_input = p_item->p_input;
-    int i_flags = p_item->i_flags;
+    int i_flags = 0;
+    i_flags = p_item->i_flags;
     lua_newtable( L );
     lua_pushinteger( L, p_item->i_id );
     lua_setfield( L, -2, "id" );
@@ -226,6 +236,7 @@ static void push_playlist_item( lua_State *L, playlist_item_t *p_item )
 static int vlclua_playlist_get( lua_State *L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
+    vlc_object_lock( p_playlist );
     int b_category = luaL_optboolean( L, 2, 1 ); /* Default to tree playlist (discared when 1st argument is a playlist_item's id) */
     playlist_item_t *p_item = NULL;
 
@@ -235,7 +246,8 @@ static int vlclua_playlist_get( lua_State *L )
         p_item = playlist_ItemGetById( p_playlist, i_id, true );
         if( !p_item )
         {
-            pl_Release( p_playlist );
+            vlclua_release_playlist_internal( p_playlist );
+            vlc_object_unlock( p_playlist );
             return 0; /* Should we return an error instead? */
         }
     }
@@ -268,7 +280,8 @@ static int vlclua_playlist_get( lua_State *L )
             }
             if( !p_item )
             {
-                pl_Release( p_playlist );
+                vlc_object_unlock( p_playlist );
+                vlclua_release_playlist_internal( p_playlist );
                 return 0; /* Should we return an error instead? */
             }
         }
@@ -279,7 +292,8 @@ static int vlclua_playlist_get( lua_State *L )
                             : p_playlist->p_root_onelevel;
     }
     push_playlist_item( L, p_item );
-    pl_Release( p_playlist );
+    vlc_object_unlock( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 1;
 }
 
@@ -290,9 +304,11 @@ static int vlclua_playlist_search( lua_State *L )
     int b_category = luaL_optboolean( L, 2, 1 ); /* default to category */
     playlist_item_t *p_item = b_category ? p_playlist->p_root_category
                                          : p_playlist->p_root_onelevel;
+    vlc_object_lock( p_playlist );
     playlist_LiveSearchUpdate( p_playlist, p_item, psz_string );
+    vlc_object_unlock( p_playlist );
     push_playlist_item( L, p_item );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 1;
 }
 
@@ -300,7 +316,7 @@ static int vlclua_playlist_current( lua_State *L )
 {
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     lua_pushinteger( L, var_GetInteger( p_playlist, "playlist-current" ) );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 1;
 }
 
@@ -339,19 +355,20 @@ static int vlclua_playlist_sort( lua_State *L )
     int i_type = luaL_optboolean( L, 2, 0 ) ? ORDER_REVERSE : ORDER_NORMAL;
     int b_category = luaL_optboolean( L, 3, 1 ); /* default to category */
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
+    vlc_object_lock( p_playlist );
     playlist_item_t *p_root = b_category ? p_playlist->p_local_category
                                          : p_playlist->p_local_onelevel;
     int i_ret = playlist_RecursiveNodeSort( p_playlist, p_root, i_mode,
                                             i_type );
-    pl_Release( p_playlist );
+    vlc_object_unlock( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return vlclua_push_ret( L, i_ret );
 }
 
 /* FIXME: split this in 3 different functions? */
 static int vlclua_playlist_status( lua_State *L )
 {
-    intf_thread_t *p_intf = (intf_thread_t *)vlclua_get_this( L );
-    playlist_t *p_playlist = pl_Yield( p_intf );
+    playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     /*
     int i_count = 0;
     lua_settop( L, 0 );*/
@@ -385,7 +402,7 @@ static int vlclua_playlist_status( lua_State *L )
     {
         lua_pushstring( L, "stopped" );
     }
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 1;
 }
 
index 5015c4c4ad2fcf7fd6f7b62c2f222df5584789fa..c0fdc73d80ad2e034571b06f07a985d8309f81a6 100644 (file)
@@ -25,6 +25,7 @@
 #define VLC_LUA_PLAYLIST_H
 
 playlist_t *vlclua_get_playlist_internal( lua_State * );
+void vlclua_release_playlist_internal( playlist_t * );
 
 #endif
 
index 100d9e91d32e1e3e075b8736021104eca6a25b45..ca855599adf16646a8e4044ac355d2fecd2626f7 100644 (file)
@@ -76,7 +76,7 @@ static int vlclua_sd_add( lua_State *L )
     const char *psz_sd = luaL_checkstring( L, 1 );
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     int i_ret = playlist_ServicesDiscoveryAdd( p_playlist, psz_sd );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return vlclua_push_ret( L, i_ret );
 }
 
@@ -85,7 +85,7 @@ static int vlclua_sd_remove( lua_State *L )
     const char *psz_sd = luaL_checkstring( L, 1 );
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     int i_ret = playlist_ServicesDiscoveryRemove( p_playlist, psz_sd );
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return vlclua_push_ret( L, i_ret );
 }
 
@@ -94,7 +94,7 @@ static int vlclua_sd_is_loaded( lua_State *L )
     const char *psz_sd = luaL_checkstring( L, 1 );
     playlist_t *p_playlist = vlclua_get_playlist_internal( L );
     lua_pushboolean( L, playlist_IsServicesDiscoveryLoaded( p_playlist, psz_sd ));
-    pl_Release( p_playlist );
+    vlclua_release_playlist_internal( p_playlist );
     return 1;
 }