From 2e68de7297ec42c1f9b6467984aa484a60ca2676 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Thu, 20 Jun 2013 19:12:08 +0300 Subject: [PATCH] lua: raise an erro from net.poll() when quitting This forces Lua RC to exit cleanly in all cases. --- modules/lua/extension.c | 1 - modules/lua/intf.c | 13 ++++++++++++- modules/lua/libs/net.c | 27 ++++++++++++++++++++------- modules/lua/services_discovery.c | 1 - modules/lua/vlc.h | 1 + share/lua/README.txt | 4 ++++ 6 files changed, 37 insertions(+), 10 deletions(-) diff --git a/modules/lua/extension.c b/modules/lua/extension.c index 79843960a9..4a7105e446 100644 --- a/modules/lua/extension.c +++ b/modules/lua/extension.c @@ -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 ); diff --git a/modules/lua/intf.c b/modules/lua/intf.c index 32fe851a73..6e34caf70a 100644 --- a/modules/lua/intf.c +++ b/modules/lua/intf.c @@ -33,6 +33,7 @@ #include #include +#include #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 ); } diff --git a/modules/lua/libs/net.c b/modules/lua/libs/net.c index ef056c189b..0f6b3939d6 100644 --- a/modules/lua/libs/net.c +++ b/modules/lua/libs/net.c @@ -41,6 +41,7 @@ #include #include #include +#include #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; } /***************************************************************************** diff --git a/modules/lua/services_discovery.c b/modules/lua/services_discovery.c index 2d6d91aa73..7cd0bd6f1b 100644 --- a/modules/lua/services_discovery.c +++ b/modules/lua/services_discovery.c @@ -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 ); diff --git a/modules/lua/vlc.h b/modules/lua/vlc.h index a0bbb1cd20..5da864b337 100644 --- a/modules/lua/vlc.h +++ b/modules/lua/vlc.h @@ -158,6 +158,7 @@ struct intf_sys_t { char *psz_filename; lua_State *L; + int fd[2]; vlc_thread_t thread; }; diff --git a/share/lua/README.txt b/share/lua/README.txt index 18469386ee..9c9c8ac8a8 100644 --- a/share/lua/README.txt +++ b/share/lua/README.txt @@ -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". -- 2.39.5