Commit 2e68de72 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

lua: raise an erro from net.poll() when quitting

This forces Lua RC to exit cleanly in all cases.
parent 80fc185b
...@@ -821,7 +821,6 @@ static lua_State* GetLuaState( extensions_manager_t *p_mgr, ...@@ -821,7 +821,6 @@ static lua_State* GetLuaState( extensions_manager_t *p_mgr,
luaopen_dialog( L, p_ext ); luaopen_dialog( L, p_ext );
luaopen_input( L ); luaopen_input( L );
luaopen_msg( L ); luaopen_msg( L );
luaopen_net( L );
luaopen_object( L ); luaopen_object( L );
luaopen_osd( L ); luaopen_osd( L );
luaopen_playlist( L ); luaopen_playlist( L );
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
#include <vlc_common.h> #include <vlc_common.h>
#include <vlc_interface.h> #include <vlc_interface.h>
#include <vlc_fs.h>
#include "vlc.h" #include "vlc.h"
#include "libs.h" #include "libs.h"
...@@ -360,8 +361,16 @@ static int Start_LuaIntf( vlc_object_t *p_this, const char *name ) ...@@ -360,8 +361,16 @@ static int Start_LuaIntf( vlc_object_t *p_this, const char *name )
p_sys->L = L; 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 ) ) 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 ); lua_close( p_sys->L );
goto error; goto error;
} }
...@@ -380,9 +389,11 @@ void Close_LuaIntf( vlc_object_t *p_this ) ...@@ -380,9 +389,11 @@ void Close_LuaIntf( vlc_object_t *p_this )
intf_thread_t *p_intf = (intf_thread_t*)p_this; intf_thread_t *p_intf = (intf_thread_t*)p_this;
intf_sys_t *p_sys = p_intf->p_sys; intf_sys_t *p_sys = p_intf->p_sys;
close( p_sys->fd[1] );
vlc_join( p_sys->thread, NULL ); 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->psz_filename );
free( p_sys ); free( p_sys );
} }
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include <vlc_network.h> #include <vlc_network.h>
#include <vlc_url.h> #include <vlc_url.h>
#include <vlc_fs.h> #include <vlc_fs.h>
#include <vlc_interface.h>
#include "../vlc.h" #include "../vlc.h"
#include "../libs.h" #include "../libs.h"
...@@ -194,19 +195,25 @@ static int vlclua_net_recv( lua_State *L ) ...@@ -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 } */ /* Takes a { fd : events } table as first arg and modifies it to { fd : revents } */
static int vlclua_net_poll( lua_State *L ) 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 ); luaL_checktype( L, 1, LUA_TTABLE );
int i_fds = 0; int i_fds = 1;
lua_pushnil( L ); lua_pushnil( L );
while( lua_next( L, 1 ) ) while( lua_next( L, 1 ) )
{ {
i_fds++; i_fds++;
lua_pop( L, 1 ); 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 ); 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 ) ) while( lua_next( L, 1 ) )
{ {
p_fds[i].fd = luaL_checkinteger( L, -2 ); p_fds[i].fd = luaL_checkinteger( L, -2 );
...@@ -220,15 +227,21 @@ static int vlclua_net_poll( lua_State *L ) ...@@ -220,15 +227,21 @@ static int vlclua_net_poll( lua_State *L )
i_ret = poll( p_fds, i_fds, -1 ); i_ret = poll( p_fds, i_fds, -1 );
while( i_ret == -1 && errno == EINTR ); 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].fd );
lua_pushinteger( L, p_fds[i].revents ); lua_pushinteger( L, p_fds[i].revents );
lua_settable( L, 1 ); lua_settable( L, 1 );
} }
lua_pushinteger( L, i_ret ); 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;
} }
/***************************************************************************** /*****************************************************************************
......
...@@ -110,7 +110,6 @@ int Open_LuaSD( vlc_object_t *p_this ) ...@@ -110,7 +110,6 @@ int Open_LuaSD( vlc_object_t *p_this )
luaL_register( L, "vlc", p_reg ); luaL_register( L, "vlc", p_reg );
luaopen_input( L ); luaopen_input( L );
luaopen_msg( L ); luaopen_msg( L );
luaopen_net( L );
luaopen_object( L ); luaopen_object( L );
luaopen_sd( L ); luaopen_sd( L );
luaopen_strings( L ); luaopen_strings( L );
......
...@@ -158,6 +158,7 @@ struct intf_sys_t ...@@ -158,6 +158,7 @@ struct intf_sys_t
{ {
char *psz_filename; char *psz_filename;
lua_State *L; lua_State *L;
int fd[2];
vlc_thread_t thread; vlc_thread_t thread;
}; };
......
...@@ -159,6 +159,10 @@ misc.quit(): Quit VLC. ...@@ -159,6 +159,10 @@ misc.quit(): Quit VLC.
Net Net
--- ---
----------------------------------------------------------------
/!\ NB: this namespace is ONLY usable for interfaces.
---
----------------------------------------------------------------
net.url_parse( url, [option delimiter] ): Parse URL. Returns a table with net.url_parse( url, [option delimiter] ): Parse URL. Returns a table with
fields "protocol", "username", "password", "host", "port", path" and fields "protocol", "username", "password", "host", "port", path" and
"option". "option".
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment