mirror of
https://github.com/videolan/vlc.git
synced 2025-01-19 14:18:11 +08:00
Remove use of select/poll timeouts in lua rc and telnet interfaces.
This commit is contained in:
parent
8bb55f6a4f
commit
a9872d2d70
@ -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 )
|
|||||||
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 )
|
|||||||
if( i_nfds > FD_SETSIZE )
|
if( i_nfds > FD_SETSIZE )
|
||||||
i_nfds = FD_SETSIZE;
|
i_nfds = FD_SETSIZE;
|
||||||
#endif
|
#endif
|
||||||
timeout.tv_sec = (int)f_timeout;
|
if( f_timeout >= 0. )
|
||||||
timeout.tv_usec = (int)(1e6*(f_timeout-(double)((int)f_timeout)));
|
{
|
||||||
i_ret = select( i_nfds, fds_read, fds_write, 0, &timeout );
|
timeout.tv_sec = (int)f_timeout;
|
||||||
|
timeout.tv_usec = (int)(1e6*(f_timeout-(double)((int)f_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
|
|||||||
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:
|
|||||||
|
|
||||||
-- 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()
|
|||||||
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()
|
|||||||
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()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function _accept( h )
|
local function _accept_and_select( h, timeout )
|
||||||
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
|
|
||||||
local fd = listener:accept( wait )
|
|
||||||
new_client( h, fd, fd, client_type.net )
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function _select( h, timeout )
|
|
||||||
local nfds = math.max( filter_client( fds_read, status.read, status.password ),
|
local nfds = math.max( filter_client( fds_read, status.read, status.password ),
|
||||||
filter_client( fds_write, status.write ) ) + 1
|
filter_client( fds_write, status.write ) ) + 1
|
||||||
|
if listeners.tcp then
|
||||||
|
for _, listener in pairs(listeners.tcp.list) do
|
||||||
|
for _, fd in pairs({listener:fds()}) do
|
||||||
|
fds_read:set(fd)
|
||||||
|
if fd >= nfds then
|
||||||
|
nfds = fd + 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
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()
|
|||||||
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()
|
|||||||
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" )
|
|||||||
|
|
||||||
--[[ 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
|
|||||||
|
|
||||||
--[[ 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
|
||||||
|
Loading…
Reference in New Issue
Block a user