]> git.sesse.net Git - vlc/commitdiff
Fix blocking/non-blocking accept in lua interface.
authorAntoine Cellerier <antoine@macbook.(none)>
Sun, 20 Dec 2009 13:24:37 +0000 (14:24 +0100)
committerAntoine Cellerier <dionoea@videolan.org>
Mon, 21 Dec 2009 20:45:16 +0000 (21:45 +0100)
modules/misc/lua/intf.c
modules/misc/lua/libs/net.c

index f9f0dce264ac17711cb5c3174efaf9c3649884f5..d7430bcab9f790222b02edbaac7f7187987716f0 100644 (file)
@@ -298,6 +298,8 @@ 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;
 
     intf_thread_t *p_intf = (intf_thread_t*)p_this;
     intf_sys_t *p_sys = p_intf->p_sys;
 
+    vlc_cancel( p_sys->thread );
+
     if( !p_sys->exiting ) /* <- Read-only here and in thread: no locking */
     {
         vlc_mutex_lock( &p_sys->lock );
     if( !p_sys->exiting ) /* <- Read-only here and in thread: no locking */
     {
         vlc_mutex_lock( &p_sys->lock );
index 321da9ef27728b5f3c85bed7ff43d6919a4a8ae1..4e4b5787ddab20c412440da156c413835ced19db 100644 (file)
 #include <lua.h>        /* Low level lua C API */
 #include <lauxlib.h>    /* Higher level C API */
 
 #include <lua.h>        /* Low level lua C API */
 #include <lauxlib.h>    /* Higher level C API */
 
+#ifdef HAVE_POLL
+#include <poll.h>       /* poll structures and defines */
+#endif
+
 #include "../vlc.h"
 #include "../libs.h"
 
 #include "../vlc.h"
 #include "../libs.h"
 
@@ -121,7 +125,36 @@ static int vlclua_net_accept( lua_State *L )
 {
     vlc_object_t *p_this = vlclua_get_this( L );
     int **ppi_fd = (int**)luaL_checkudata( L, 1, "net_listen" );
 {
     vlc_object_t *p_this = vlclua_get_this( L );
     int **ppi_fd = (int**)luaL_checkudata( L, 1, "net_listen" );
-    int i_fd = net_Accept( p_this, *ppi_fd );
+    int *pi_fd = *ppi_fd;
+    int i_timeout = luaL_optint( L, 2, -1 ); /* block is default */
+
+    /* Implement net_Accept with timeout */
+    int i_fd = -1;
+
+    unsigned int i_count = 1;
+    while( pi_fd[0][i_count] != -1 )
+        i_count++;
+
+    struct pollfd ufd[i_count+1];
+    unsigned int i;
+    for( i = 0; i < i_count; i++ )
+    {
+        ufd[i].fd = pi_fd[i];
+        ufd[i].events = POLLIN;
+    }
+
+    if( poll( ufd, i_count, i_timeout ) > 0 )
+    {
+        for( i = 0; i < i_count; i++ )
+        {
+            if( !ufd[i].revents ) continue;
+            i_fd = net_AcceptSingle( p_this, ufd[i].fd );
+            if( i_fd == -1 ) continue;
+            memmove( pi_fd + i, pi_fd + i + 1, i_count - (i + 1) );
+            pi_fd[i_count - 1] = ufd[i].fd;
+        }
+    }
+
     lua_pushinteger( L, i_fd );
     return 1;
 }
     lua_pushinteger( L, i_fd );
     return 1;
 }