moonbridge
diff moonbridge_io.c @ 280:1a4f89f4c712
Modified behavior of moonbridge_io.signalsocket(...); Fixed usage of moonbridge_io.signalsocket(...) in moonbridge_http module
author | jbe |
---|---|
date | Tue Jun 06 21:58:26 2017 +0200 (2017-06-06) |
parents | d4c82c90d244 |
children | 6bb191b6ead5 |
line diff
1.1 --- a/moonbridge_io.c Tue Jun 06 20:19:09 2017 +0200 1.2 +++ b/moonbridge_io.c Tue Jun 06 21:58:26 2017 +0200 1.3 @@ -66,6 +66,7 @@ 1.4 #define MOONBR_IO_CHILD_MT_REGKEY "moonbridge_io_child" 1.5 #define MOONBR_IO_CHILD_PT_REGKEY "moonbridge_io_child_pt" 1.6 #define MOONBR_IO_SIGNALS_REGKEY "moonbridge_io_signals" 1.7 +#define MOONBR_IO_SIGNALSOCKETS_REGKEY "moonbridge_io_signalsockets" 1.8 1.9 #ifdef MOONBR_IO_USE_TLS 1.10 1.11 @@ -1641,13 +1642,20 @@ 1.12 if (socketpair(PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, moonbr_io_signalfds+2*sig)) { 1.13 luaL_error(L, "Could not create socket pair for signal queueing"); 1.14 } 1.15 - errno = 0; 1.16 - signal(sig, moonbr_io_signalhandler); 1.17 - if (errno) luaL_error(L, "Could not install signal handler (invalid signal number %i?)", sig); 1.18 } 1.19 - fd = dup(moonbr_io_signalfd_read(sig)); 1.20 + errno = 0; 1.21 + signal(sig, moonbr_io_signalhandler); 1.22 + if (errno) luaL_error(L, "Could not install signal handler (invalid signal number %i?)", sig); 1.23 + lua_getfield(L, LUA_REGISTRYINDEX, MOONBR_IO_SIGNALSOCKETS_REGKEY); 1.24 + lua_pushinteger(L, sig); 1.25 + lua_gettable(L, -2); 1.26 + if (!lua_isnil(L, -1)) return 1; 1.27 + fd = dup(moonbr_io_signalfd_read(sig)); /* avoid close on Lua error */ 1.28 if (fd < 0) luaL_error(L, "Could not create duplicated file descriptor for signal socket"); 1.29 moonbr_io_pushhandle(L, fd); 1.30 + lua_pushinteger(L, sig); 1.31 + lua_pushvalue(L, -2); 1.32 + lua_settable(L, -5); /* store reference to signal socket in cache table */ 1.33 return 1; 1.34 } 1.35 1.36 @@ -2110,6 +2118,9 @@ 1.37 lua_pushvalue(L, -1); 1.38 lua_setfield(L, -3, "signals"); 1.39 lua_setfield(L, LUA_REGISTRYINDEX, MOONBR_IO_SIGNALS_REGKEY); 1.40 + 1.41 + lua_newtable(L); // signal sockets 1.42 + lua_setfield(L, LUA_REGISTRYINDEX, MOONBR_IO_SIGNALSOCKETS_REGKEY); 1.43 1.44 luaL_setfuncs(L, moonbr_io_module_funcs, 0); 1.45 return 1;