[vlc-commits] lua: vector out files descriptable table code

Rémi Denis-Courmont git at videolan.org
Mon Mar 24 18:56:24 CET 2014


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Mar 24 19:45:43 2014 +0200| [bfe17fd33e68ea4aed301147fd4e090fc2f6abb6] | committer: Rémi Denis-Courmont

lua: vector out files descriptable table code

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=bfe17fd33e68ea4aed301147fd4e090fc2f6abb6
---

 modules/lua/intf.c     |   26 ++++--------
 modules/lua/libs.h     |    1 -
 modules/lua/libs/net.c |  104 +++++++++++++++++++++++++++++-------------------
 modules/lua/vlc.h      |   26 +++++++-----
 4 files changed, 87 insertions(+), 70 deletions(-)

diff --git a/modules/lua/intf.c b/modules/lua/intf.c
index 9dacd8d..6194354 100644
--- a/modules/lua/intf.c
+++ b/modules/lua/intf.c
@@ -223,8 +223,6 @@ static int Start_LuaIntf( vlc_object_t *p_this, const char *name )
     }
     p_intf->p_sys = p_sys;
 
-    vlclua_fd_init( p_sys );
-
     p_sys->psz_filename = vlclua_find_file( "intf", name );
     if( !p_sys->psz_filename )
     {
@@ -255,7 +253,11 @@ static int Start_LuaIntf( vlc_object_t *p_this, const char *name )
     luaopen_input( L );
     luaopen_msg( L );
     luaopen_misc( L );
-    luaopen_net_intf( L );
+    if( vlclua_fd_init( L, &p_sys->dtable ) )
+    {
+        lua_close( L );
+        goto error;
+    }
     luaopen_object( L );
     luaopen_osd( L );
     luaopen_playlist( L );
@@ -364,20 +366,9 @@ static int Start_LuaIntf( vlc_object_t *p_this, const char *name )
 
     p_sys->L = L;
 
-#ifndef _WIN32
-    if( vlc_pipe( p_sys->fd ) )
-    {
-        lua_close( p_sys->L );
-        goto error;
-    }
-#else
-# define close(fd) (void)0
-#endif
-
     if( vlc_clone( &p_sys->thread, Run, p_intf, VLC_THREAD_PRIORITY_LOW ) )
     {
-        close( p_sys->fd[1] );
-        close( p_sys->fd[0] );
+        vlclua_fd_cleanup( &p_sys->dtable );
         lua_close( p_sys->L );
         goto error;
     }
@@ -396,12 +387,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] );
+    vlclua_fd_interrupt( &p_sys->dtable );
     vlc_join( p_sys->thread, NULL );
 
+    vlclua_fd_cleanup( &p_sys->dtable );
     lua_close( p_sys->L );
-    close( p_sys->fd[0] );
-    vlclua_fd_destroy( p_sys );
     free( p_sys->psz_filename );
     free( p_sys );
 }
diff --git a/modules/lua/libs.h b/modules/lua/libs.h
index 1951cf8..ffac4dc 100644
--- a/modules/lua/libs.h
+++ b/modules/lua/libs.h
@@ -31,7 +31,6 @@ void luaopen_input( lua_State * );
 void luaopen_msg( lua_State * );
 void luaopen_misc( lua_State * );
 void luaopen_net_generic( lua_State * );
-void luaopen_net_intf( lua_State * );
 void luaopen_object( lua_State * );
 void luaopen_osd( lua_State * );
 void luaopen_playlist( lua_State * );
diff --git a/modules/lua/libs/net.c b/modules/lua/libs/net.c
index d4fe299..fe2e37f 100644
--- a/modules/lua/libs/net.c
+++ b/modules/lua/libs/net.c
@@ -42,50 +42,40 @@
 #include <vlc_network.h>
 #include <vlc_url.h>
 #include <vlc_fs.h>
-#include <vlc_interface.h>
 
 #include "../vlc.h"
 #include "../libs.h"
+#include "misc.h"
 
-void vlclua_fd_init( intf_sys_t *sys )
+static vlclua_dtable_t *vlclua_get_dtable( lua_State *L )
 {
-    sys->fdv = NULL;
-    sys->fdc = 0;
-}
-
-/** Releases all (leaked) VLC Lua file descriptors. */
-void vlclua_fd_destroy( intf_sys_t *sys )
-{
-    for( unsigned i = 0; i < sys->fdc; i++ )
-         net_Close( sys->fdv[i] );
-    free( sys->fdv );
+    return vlclua_get_object( L, vlclua_get_dtable );
 }
 
 /** Maps an OS file descriptor to a VLC Lua file descriptor */
 static int vlclua_fd_map( lua_State *L, int fd )
 {
-    intf_thread_t *intf = (intf_thread_t *)vlclua_get_this( L );
-    intf_sys_t *sys = intf->p_sys;
+    vlclua_dtable_t *dt = vlclua_get_dtable( L );
 
     if( (unsigned)fd < 3u )
         return -1;
 
 #ifndef NDEBUG
-    for( unsigned i = 0; i < sys->fdc; i++ )
-        assert( sys->fdv[i] != fd );
+    for( unsigned i = 0; i < dt->fdc; i++ )
+        assert( dt->fdv[i] != fd );
 #endif
 
-    if( sys->fdc >= 64 )
+    if( dt->fdc >= 64 )
         return -1;
 
-    int *fdv = realloc( sys->fdv, (sys->fdc + 1) * sizeof (sys->fdv[0]) );
+    int *fdv = realloc( dt->fdv, (dt->fdc + 1) * sizeof (dt->fdv[0]) );
     if( unlikely(fdv == NULL) )
         return -1;
 
-    sys->fdv = fdv;
-    sys->fdv[sys->fdc] = fd;
-    fd = 3 + sys->fdc;
-    sys->fdc++;
+    dt->fdv = fdv;
+    dt->fdv[dt->fdc] = fd;
+    fd = 3 + dt->fdc;
+    dt->fdc++;
     return fd;
 }
 
@@ -100,25 +90,23 @@ static int vlclua_fd_map_safe( lua_State *L, int fd )
 /** Gets the OS file descriptor mapped to a VLC Lua file descriptor */
 static int vlclua_fd_get( lua_State *L, unsigned idx )
 {
-    intf_thread_t *intf = (intf_thread_t *)vlclua_get_this( L );
-    intf_sys_t *sys = intf->p_sys;
+    vlclua_dtable_t *dt = vlclua_get_dtable( L );
 
     if( idx < 3u )
         return idx;
     idx -= 3;
-    return (idx < sys->fdc) ? sys->fdv[idx] : -1;
+    return (idx < dt->fdc) ? dt->fdv[idx] : -1;
 }
 
 /** Gets the VLC Lua file descriptor mapped from an OS file descriptor */
 static int vlclua_fd_get_lua( lua_State *L, int fd )
 {
-    intf_thread_t *intf = (intf_thread_t *)vlclua_get_this( L );
-    intf_sys_t *sys = intf->p_sys;
+    vlclua_dtable_t *dt = vlclua_get_dtable( L );
 
     if( (unsigned)fd < 3u )
         return fd;
-    for( unsigned i = 0; i < sys->fdc; i++ )
-        if( sys->fdv[i] == fd )
+    for( unsigned i = 0; i < dt->fdc; i++ )
+        if( dt->fdv[i] == fd )
             return 3 + i;
     return -1;
 }
@@ -126,25 +114,24 @@ static int vlclua_fd_get_lua( lua_State *L, int fd )
 /** Unmaps an OS file descriptor from VLC Lua */
 static void vlclua_fd_unmap( lua_State *L, unsigned idx )
 {
-    intf_thread_t *intf = (intf_thread_t *)vlclua_get_this( L );
-    intf_sys_t *sys = intf->p_sys;
+    vlclua_dtable_t *dt = vlclua_get_dtable( L );
     int fd = -1;
 
     if( idx < 3u )
         return; /* Never close stdin/stdout/stderr. */
 
     idx -= 3;
-    if( idx >= sys->fdc )
+    if( idx >= dt->fdc )
         return;
 
-    fd = sys->fdv[idx];
-    sys->fdc--;
-    memmove( sys->fdv + idx, sys->fdv + idx + 1,
-             (sys->fdc - idx) * sizeof (sys->fdv[0]) );
+    fd = dt->fdv[idx];
+    dt->fdc--;
+    memmove( dt->fdv + idx, dt->fdv + idx + 1,
+             (dt->fdc - idx) * sizeof (dt->fdv[0]) );
     /* realloc() not really needed */
 #ifndef NDEBUG
-    for( unsigned i = 0; i < sys->fdc; i++ )
-        assert( sys->fdv[i] != fd );
+    for( unsigned i = 0; i < dt->fdc; i++ )
+        assert( dt->fdv[i] != fd );
 #endif
 }
 
@@ -322,8 +309,7 @@ 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;
+    vlclua_dtable_t *dt = vlclua_get_dtable( L );
 
     luaL_checktype( L, 1, LUA_TTABLE );
 
@@ -340,7 +326,7 @@ static int vlclua_net_poll( lua_State *L )
 
     lua_pushnil( L );
     int i = 1;
-    p_fds[0].fd = sys->fd[0];
+    p_fds[0].fd = dt->fd[0];
     p_fds[0].events = POLLIN;
     while( lua_next( L, 1 ) )
     {
@@ -509,7 +495,7 @@ static const luaL_Reg vlclua_net_intf_reg[] = {
     { NULL, NULL }
 };
 
-void luaopen_net_intf( lua_State *L )
+static void luaopen_net_intf( lua_State *L )
 {
     lua_newtable( L );
     luaL_register( L, NULL, vlclua_net_intf_reg );
@@ -525,6 +511,40 @@ void luaopen_net_intf( lua_State *L )
     lua_setfield( L, -2, "net" );
 }
 
+int vlclua_fd_init( lua_State *L, vlclua_dtable_t *dt )
+{
+#ifndef _WIN32
+    if( vlc_pipe( dt->fd ) )
+        return -1;
+#endif
+    dt->fdv = NULL;
+    dt->fdc = 0;
+    vlclua_set_object( L, vlclua_get_dtable, dt );
+    luaopen_net_intf( L );
+    return 0;
+}
+
+void vlclua_fd_interrupt( vlclua_dtable_t *dt )
+{
+#ifndef _WIN32
+    close( dt->fd[1] );
+    dt->fd[1] = -1;
+#endif
+}
+
+/** Releases all (leaked) VLC Lua file descriptors. */
+void vlclua_fd_cleanup( vlclua_dtable_t *dt )
+{
+    for( unsigned i = 0; i < dt->fdc; i++ )
+         net_Close( dt->fdv[i] );
+    free( dt->fdv );
+#ifndef _WIN32
+    if( dt->fd[1] != -1 )
+        close( dt->fd[1] );
+    close( dt->fd[0] );
+#endif
+}
+
 static const luaL_Reg vlclua_net_generic_reg[] = {
     { "url_parse", vlclua_url_parse },
     { "stat", vlclua_stat }, /* Not really "net" */
diff --git a/modules/lua/vlc.h b/modules/lua/vlc.h
index 16bea84..d54a5d3 100644
--- a/modules/lua/vlc.h
+++ b/modules/lua/vlc.h
@@ -155,23 +155,31 @@ int vlclua_playlist_add_internal( vlc_object_t *, lua_State *, playlist_t *,
 int vlclua_add_modules_path( lua_State *, const char *psz_filename );
 
 /**
- * Per-interface private state
+ * File descriptors table
  */
-struct intf_sys_t
+typedef struct
 {
-    char *psz_filename;
-    lua_State *L;
+    int *fdv;
+    unsigned fdc;
 #ifndef _WIN32
     int fd[2];
 #endif
-    int *fdv;
-    unsigned fdc;
+} vlclua_dtable_t;
+
+int vlclua_fd_init( lua_State *, vlclua_dtable_t * );
+void vlclua_fd_interrupt( vlclua_dtable_t * );
+void vlclua_fd_cleanup( vlclua_dtable_t * );
 
+/**
+ * Per-interface private state
+ */
+struct intf_sys_t
+{
+    char *psz_filename;
+    lua_State *L;
     vlc_thread_t thread;
+    vlclua_dtable_t dtable;
 };
 
-void vlclua_fd_init( struct intf_sys_t * );
-void vlclua_fd_destroy( struct intf_sys_t * );
-
 #endif /* VLC_LUA_H */
 



More information about the vlc-commits mailing list