]> git.sesse.net Git - vlc/commitdiff
lua: raise an erro from net.poll() when quitting
authorRémi Denis-Courmont <remi@remlab.net>
Thu, 20 Jun 2013 16:12:08 +0000 (19:12 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Thu, 20 Jun 2013 16:13:45 +0000 (19:13 +0300)
This forces Lua RC to exit cleanly in all cases.

modules/lua/extension.c
modules/lua/intf.c
modules/lua/libs/net.c
modules/lua/services_discovery.c
modules/lua/vlc.h
share/lua/README.txt

index 79843960a9f762fe06d515230276f9e5a01547e5..4a7105e446f1a4cae981580dc729de8aedaaa66a 100644 (file)
@@ -821,7 +821,6 @@ static lua_State* GetLuaState( extensions_manager_t *p_mgr,
             luaopen_dialog( L, p_ext );
             luaopen_input( L );
             luaopen_msg( L );
-            luaopen_net( L );
             luaopen_object( L );
             luaopen_osd( L );
             luaopen_playlist( L );
index 32fe851a7300b416a5eb00060a00e71445b83ace..6e34caf70aa5e26824b3c01035b01a6e8650426a 100644 (file)
@@ -33,6 +33,7 @@
 
 #include <vlc_common.h>
 #include <vlc_interface.h>
+#include <vlc_fs.h>
 
 #include "vlc.h"
 #include "libs.h"
@@ -360,8 +361,16 @@ static int Start_LuaIntf( vlc_object_t *p_this, const char *name )
 
     p_sys->L = L;
 
+    if( vlc_pipe( p_sys->fd ) )
+    {
+        lua_close( p_sys->L );
+        goto error;
+    }
+
     if( vlc_clone( &p_sys->thread, Run, p_intf, VLC_THREAD_PRIORITY_LOW ) )
     {
+        close( p_sys->fd[1] );
+        close( p_sys->fd[0] );
         lua_close( p_sys->L );
         goto error;
     }
@@ -380,9 +389,11 @@ void Close_LuaIntf( vlc_object_t *p_this )
     intf_thread_t *p_intf = (intf_thread_t*)p_this;
     intf_sys_t *p_sys = p_intf->p_sys;
 
+    close( p_sys->fd[1] );
     vlc_join( p_sys->thread, NULL );
-    lua_close( p_sys->L );
 
+    lua_close( p_sys->L );
+    close( p_sys->fd[0] );
     free( p_sys->psz_filename );
     free( p_sys );
 }
index ef056c189b9222b459dec36b58d05d27dadf6990..0f6b3939d6cf2b0b01d70627fc437ebd97200a81 100644 (file)
@@ -41,6 +41,7 @@
 #include <vlc_network.h>
 #include <vlc_url.h>
 #include <vlc_fs.h>
+#include <vlc_interface.h>
 
 #include "../vlc.h"
 #include "../libs.h"
@@ -194,19 +195,25 @@ static int vlclua_net_recv( lua_State *L )
 /* Takes a { fd : events } table as first arg and modifies it to { fd : revents } */
 static int vlclua_net_poll( lua_State *L )
 {
+    intf_thread_t *intf = (intf_thread_t *)vlclua_get_this( L );
+    intf_sys_t *sys = intf->p_sys;
+
     luaL_checktype( L, 1, LUA_TTABLE );
 
-    int i_fds = 0;
+    int i_fds = 1;
     lua_pushnil( L );
     while( lua_next( L, 1 ) )
     {
         i_fds++;
         lua_pop( L, 1 );
     }
-    struct pollfd *p_fds = malloc( i_fds * sizeof( struct pollfd ) );
-    vlc_cleanup_push( free, p_fds );
+
+    struct pollfd *p_fds = xmalloc( i_fds * sizeof( *p_fds ) );
+
     lua_pushnil( L );
-    int i = 0;
+    int i = 1;
+    p_fds[0].fd = sys->fd[0];
+    p_fds[0].events = POLLIN;
     while( lua_next( L, 1 ) )
     {
         p_fds[i].fd = luaL_checkinteger( L, -2 );
@@ -220,15 +227,21 @@ static int vlclua_net_poll( lua_State *L )
         i_ret = poll( p_fds, i_fds, -1 );
     while( i_ret == -1 && errno == EINTR );
 
-    for( i = 0; i < i_fds; i++ )
+    for( i = 1; i < i_fds; i++ )
     {
         lua_pushinteger( L, p_fds[i].fd );
         lua_pushinteger( L, p_fds[i].revents );
         lua_settable( L, 1 );
     }
     lua_pushinteger( L, i_ret );
-    vlc_cleanup_run();
-    return 1;
+
+    if( p_fds[0].revents )
+        i_ret = luaL_error( L, "Interrupted." );
+    else
+        i_ret = 1;
+    free( p_fds );
+
+    return i_ret;
 }
 
 /*****************************************************************************
index 2d6d91aa7349af3ce000467950313e99afbe56f9..7cd0bd6f1b3781eda32c5212332377907b7a0087 100644 (file)
@@ -110,7 +110,6 @@ int Open_LuaSD( vlc_object_t *p_this )
     luaL_register( L, "vlc", p_reg );
     luaopen_input( L );
     luaopen_msg( L );
-    luaopen_net( L );
     luaopen_object( L );
     luaopen_sd( L );
     luaopen_strings( L );
index a0bbb1cd20504736f7e93a6e2a33b30be42cd6fc..5da864b337f3e0d80259c2de823716034049222d 100644 (file)
@@ -158,6 +158,7 @@ struct intf_sys_t
 {
     char *psz_filename;
     lua_State *L;
+    int fd[2];
 
     vlc_thread_t thread;
 };
index 18469386ee052e85a2e999c004b5a95eb6034c97..9c9c8ac8a84aed1182200b3954d751d0e539cfe6 100644 (file)
@@ -159,6 +159,10 @@ misc.quit(): Quit VLC.
 
 Net
 ---
+----------------------------------------------------------------
+/!\ NB: this namespace is ONLY usable for interfaces.
+---
+----------------------------------------------------------------
 net.url_parse( url, [option delimiter] ): Parse URL. Returns a table with
   fields "protocol", "username", "password", "host", "port", path" and
   "option".