Commit a9872d2d authored by Antoine Cellerier's avatar Antoine Cellerier

Remove use of select/poll timeouts in lua rc and telnet interfaces.

parent 8bb55f6a
...@@ -83,9 +83,11 @@ static int vlclua_url_parse( lua_State *L ) ...@@ -83,9 +83,11 @@ static int vlclua_url_parse( lua_State *L )
*****************************************************************************/ *****************************************************************************/
static int vlclua_net_listen_close( lua_State * ); static int vlclua_net_listen_close( lua_State * );
static int vlclua_net_accept( lua_State * ); static int vlclua_net_accept( lua_State * );
static int vlclua_net_fds( lua_State * );
static const luaL_Reg vlclua_net_listen_reg[] = { static const luaL_Reg vlclua_net_listen_reg[] = {
{ "accept", vlclua_net_accept }, { "accept", vlclua_net_accept },
{ "fds", vlclua_net_fds },
{ NULL, NULL } { NULL, NULL }
}; };
...@@ -121,6 +123,19 @@ static int vlclua_net_listen_close( lua_State *L ) ...@@ -121,6 +123,19 @@ static int vlclua_net_listen_close( lua_State *L )
return 0; return 0;
} }
static int vlclua_net_fds( lua_State *L )
{
vlc_object_t *p_this = vlclua_get_this( L );
int **ppi_fd = (int**)luaL_checkudata( L, 1, "net_listen" );
int *pi_fd = *ppi_fd;
int i_count = 0;
while( pi_fd[i_count] != -1 )
lua_pushinteger( L, pi_fd[i_count++] );
return i_count;
}
static int vlclua_net_accept( lua_State *L ) static int vlclua_net_accept( lua_State *L )
{ {
vlc_object_t *p_this = vlclua_get_this( L ); vlc_object_t *p_this = vlclua_get_this( L );
...@@ -206,12 +221,14 @@ static int vlclua_net_select( lua_State *L ) ...@@ -206,12 +221,14 @@ static int vlclua_net_select( lua_State *L )
if( i_nfds > FD_SETSIZE ) if( i_nfds > FD_SETSIZE )
i_nfds = FD_SETSIZE; i_nfds = FD_SETSIZE;
#endif #endif
if( f_timeout >= 0. )
{
timeout.tv_sec = (int)f_timeout; timeout.tv_sec = (int)f_timeout;
timeout.tv_usec = (int)(1e6*(f_timeout-(double)((int)f_timeout))); timeout.tv_usec = (int)(1e6*(f_timeout-(double)((int)f_timeout)));
i_ret = select( i_nfds, fds_read, fds_write, 0, &timeout ); }
i_ret = select( i_nfds, fds_read, fds_write, 0, f_timeout >= 0. ? &timeout : NULL );
lua_pushinteger( L, i_ret ); lua_pushinteger( L, i_ret );
lua_pushinteger( L, (double)timeout.tv_sec+((double)timeout.tv_usec)/1e-6 ); return 1;
return 2;
} }
/***************************************************************************** /*****************************************************************************
......
...@@ -112,8 +112,9 @@ net.url_parse( url, [option delimiter] ): Parse URL. Returns a table with ...@@ -112,8 +112,9 @@ 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".
net.listen_tcp( host, port ): Listen to TCP connections. This returns an net.listen_tcp( host, port ): Listen to TCP connections. This returns an
object with an accept method. This method takes an optional timeout object with an accept and an fds method. The accept takes an optional timeout
argument (in milliseconds). For example: argument (in milliseconds). The fds method returns a list of fds you can call
select on before using the accept method. For example:
local l = vlc.net.listen_tcp( "localhost", 1234 ) local l = vlc.net.listen_tcp( "localhost", 1234 )
while true do while true do
local fd = l:accept( 500 ) local fd = l:accept( 500 )
......
...@@ -39,11 +39,8 @@ Example use: ...@@ -39,11 +39,8 @@ Example use:
-- The main loop -- The main loop
while not vlc.misc.should_die() do while not vlc.misc.should_die() do
-- accept new connections -- accept new connections and select active clients
h:accept() local write, read = h:accept_and_select()
-- select active clients
local write, read = h:select( 0.1 ) -- 0.1 is a timeout in seconds
-- handle clients in write mode -- handle clients in write mode
for _, client in pairs(write) do for _, client in pairs(write) do
...@@ -80,7 +77,7 @@ function host() ...@@ -80,7 +77,7 @@ function host()
local fds_write = vlc.net.fd_set_new() local fds_write = vlc.net.fd_set_new()
-- private methods -- private methods
local function client_accept( clients, listen ) --[[local function client_accept( clients, listen )
local wait local wait
if #clients == 0 then if #clients == 0 then
wait = -1 wait = -1
...@@ -88,7 +85,7 @@ function host() ...@@ -88,7 +85,7 @@ function host()
wait = 0 wait = 0
end end
return listen:accept( wait ) return listen:accept( wait )
end end]]
local function fd_client( client ) local function fd_client( client )
if client.status == status.read then if client.status == status.read then
...@@ -250,26 +247,22 @@ function host() ...@@ -250,26 +247,22 @@ function host()
end end
end end
local function _accept( h ) local function _accept_and_select( h, timeout )
local nfds = math.max( filter_client( fds_read, status.read, status.password ),
filter_client( fds_write, status.write ) ) + 1
if listeners.tcp then if listeners.tcp then
local wait
if #clients == 0 and not listeners.stdio and #listeners.tcp.list == 1 then
wait = -1 -- blocking
else
wait = 0
end
for _, listener in pairs(listeners.tcp.list) do for _, listener in pairs(listeners.tcp.list) do
local fd = listener:accept( wait ) for _, fd in pairs({listener:fds()}) do
new_client( h, fd, fd, client_type.net ) fds_read:set(fd)
if fd >= nfds then
nfds = fd + 1
end
end end
end end
end end
local function _select( h, timeout )
local nfds = math.max( filter_client( fds_read, status.read, status.password ),
filter_client( fds_write, status.write ) ) + 1
local ret = vlc.net.select( nfds, fds_read, fds_write, local ret = vlc.net.select( nfds, fds_read, fds_write,
timeout or 0.5 ) timeout or -1 )
local wclients = {} local wclients = {}
local rclients = {} local rclients = {}
if ret > 0 then if ret > 0 then
...@@ -281,6 +274,17 @@ function host() ...@@ -281,6 +274,17 @@ function host()
table.insert(rclients,client) table.insert(rclients,client)
end end
end end
if listeners.tcp then
for _, listener in pairs(listeners.tcp.list) do
for _, fd in pairs({listener:fds()}) do
if fds_read:isset(fd) then
local afd = listener:accept(0)
new_client( h, afd, afd, client_type.net )
break
end
end
end
end
end end
return wclients, rclients return wclients, rclients
end end
...@@ -311,8 +315,7 @@ function host() ...@@ -311,8 +315,7 @@ function host()
listen = _listen, listen = _listen,
listen_tcp = _listen_tcp, listen_tcp = _listen_tcp,
listen_stdio = _listen_stdio, listen_stdio = _listen_stdio,
accept = _accept, accept_and_select = _accept_and_select,
select = _select,
broadcast = _broadcast, broadcast = _broadcast,
} }
......
...@@ -651,8 +651,7 @@ h:listen( config.hosts or config.host or "*console" ) ...@@ -651,8 +651,7 @@ h:listen( config.hosts or config.host or "*console" )
--[[ The main loop ]] --[[ The main loop ]]
while not vlc.misc.should_die() do while not vlc.misc.should_die() do
h:accept() local write, read = h:accept_and_select()
local write, read = h:select(0.1)
for _, client in pairs(write) do for _, client in pairs(write) do
local len = client:send() local len = client:send()
......
...@@ -172,8 +172,7 @@ end ...@@ -172,8 +172,7 @@ end
--[[ The main loop ]] --[[ The main loop ]]
while not vlc.misc.should_die() do while not vlc.misc.should_die() do
h:accept() local w, r = h:accept_and_select()
local w, r = h:select( 0.1 )
-- Handle writes -- Handle writes
for _, client in pairs(w) do for _, client in pairs(w) do
......
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