[vlc-commits] lua: raise an erro from net.poll() when quitting
Rémi Denis-Courmont
git at videolan.org
Thu Jun 20 18:14:02 CEST 2013
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Jun 20 19:12:08 2013 +0300| [2e68de7297ec42c1f9b6467984aa484a60ca2676] | committer: Rémi Denis-Courmont
lua: raise an erro from net.poll() when quitting
This forces Lua RC to exit cleanly in all cases.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=2e68de7297ec42c1f9b6467984aa484a60ca2676
---
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 7984396..4a7105e 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 32fe851..6e34caf 100644
--- a/modules/lua/intf.c
+++ b/modules/lua/intf.c
@@ -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 );
}
diff --git a/modules/lua/libs/net.c b/modules/lua/libs/net.c
index ef056c1..0f6b393 100644
--- a/modules/lua/libs/net.c
+++ b/modules/lua/libs/net.c
@@ -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;
}
/*****************************************************************************
diff --git a/modules/lua/services_discovery.c b/modules/lua/services_discovery.c
index 2d6d91a..7cd0bd6 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 a0bbb1c..5da864b 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 1846938..9c9c8ac 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".
More information about the vlc-commits
mailing list