From a9e609d60cdc0ff852277caafbc2f3f3949e18d9 Mon Sep 17 00:00:00 2001 From: Axel Kittenberger Date: Fri, 11 May 2018 09:07:03 +0200 Subject: [PATCH] reworking signal system --- CMakeLists.txt | 2 ++ core/mci.c | 4 ++++ core/observe.c | 2 +- core/signal.c | 36 +++++++++++++++++++++++++++++++++++- core/signal.h | 5 ++++- default/default.lua | 2 +- default/rsync.lua | 2 +- mantle/inlet.lua | 2 +- mantle/mci.lua | 8 ++++---- mantle/signal.lua | 38 +++++++++++++++++++++++++++++--------- 10 files changed, 82 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3f0e7d9..8eabe44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,8 @@ cmake_minimum_required( VERSION 2.8 ) set( LSYNCD_VERSION 3.0.0-devel ) set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/" ) +# More Warnings +set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS} -Wall") # Finding Lua find_package( Lua REQUIRED ) diff --git a/core/mci.c b/core/mci.c index f8e7b55..6a8f7d5 100644 --- a/core/mci.c +++ b/core/mci.c @@ -335,6 +335,8 @@ l_mci( lua_State *L ) l_stackdump( L ); exit( -1 ); } + + return 0; } @@ -773,6 +775,7 @@ mci_load_default( { printlogf( L, "Error", "loading default sync implementations: %s", lua_tostring( L, -1 ) ); + exit( -1 ); } @@ -786,6 +789,7 @@ mci_load_default( { printlogf( L, "Error", "preparing default sync implementations: %s", lua_tostring( L, -1 ) ); + exit( -1 ); } } diff --git a/core/observe.c b/core/observe.c index 382640d..df1df25 100644 --- a/core/observe.c +++ b/core/observe.c @@ -247,7 +247,7 @@ observe_select timeout, &sigset ); - // FIXME handle signals + signal_notify( L ); // something happened! if( pr >= 0 ) diff --git a/core/signal.c b/core/signal.c index 3a802d3..234c274 100644 --- a/core/signal.c +++ b/core/signal.c @@ -22,6 +22,7 @@ #include #include "log.h" +#include "mci.h" #include "mem.h" @@ -59,6 +60,7 @@ volatile sig_atomic_t sigcode = 0; /* | signal handler */ +/* static void signal_child( int sig ) { @@ -67,6 +69,7 @@ signal_child( int sig ) // This signal handler is just installed so the kernel // keeps finished child processes as zombies waiting to be reaped. } +*/ /* @@ -121,7 +124,9 @@ signal_init( ) | false if they denied it */ int -l_onsignal( lua_State *L ) +l_onsignal( + lua_State *L +) { int sigc = 0; int ok; @@ -178,6 +183,8 @@ l_onsignal( lua_State *L ) sigaction( signum, &act, NULL ); } + handlers_len = 0; + // and now the signalmask is applied sigprocmask( SIG_BLOCK, &blockmask, NULL ); @@ -230,3 +237,30 @@ l_onsignal( lua_State *L ) return 0; } + +/* +| Notifies the mantle about queued signals. +*/ +void +signal_notify( + lua_State *L +) +{ + if( queue_pos == 0 ) return; + + load_mci( L, "signalEvent" ); + + lua_createtable( L, queue_pos, 0 ); + + int p = 1; + while( queue_pos > 0 ) + { + lua_pushinteger( L, p++ ); + lua_pushinteger( L, queue[ --queue_pos ] ); + lua_settable( L, -3 ); + } + + if( lua_pcall( L, 1, 0, -3 ) ) exit( -1 ); + lua_pop( L, 1 ); +} + diff --git a/core/signal.h b/core/signal.h index 885d5d3..c6d4b2b 100644 --- a/core/signal.h +++ b/core/signal.h @@ -15,10 +15,13 @@ extern volatile sig_atomic_t term; extern volatile sig_atomic_t sigcode; -// Initializes signal handling. +// initializes signal handling. extern void signal_init( ); // FIXME int l_onsignal( lua_State *L ); +// notifies the mantle about signals +extern void signal_notify( lua_State *L ); + #endif diff --git a/default/default.lua b/default/default.lua index 24e913d..9d99d01 100644 --- a/default/default.lua +++ b/default/default.lua @@ -175,7 +175,7 @@ default.collect = function then log( 'Error', 'Failure with a list with exitcode = ', exitcode ) else - log( 'Error', 'Unknown exitcode "',exitcode,'" with a list' ) + log( 'Error', 'Unknown exitcode "', exitcode, '" with a list' ) rc = 'die' end diff --git a/default/rsync.lua b/default/rsync.lua index 6feb81c..baeba44 100644 --- a/default/rsync.lua +++ b/default/rsync.lua @@ -147,7 +147,7 @@ rsync.action = function end -- - -- Gets the list of paths for the event list + -- Gets the list of paths for the event list. -- -- Deletes create multi match patterns -- diff --git a/mantle/inlet.lua b/mantle/inlet.lua index 3314ed9..4c9a961 100644 --- a/mantle/inlet.lua +++ b/mantle/inlet.lua @@ -358,7 +358,7 @@ local eventListFuncs = -- getPaths = function ( - elist, -- handle returned by getevents( ) + elist, -- handle returned by getEvents( ) mutator -- if not nil called with ( etype, path, path2 ) -- returns one or two strings to add. ) diff --git a/mantle/mci.lua b/mantle/mci.lua index b411456..4018ed5 100644 --- a/mantle/mci.lua +++ b/mantle/mci.lua @@ -437,9 +437,9 @@ function mci.initialize end -- from now on use logging as configured instead of stdout/err. - lsyncdStatus = 'run'; + lsyncdStatus = 'run' - configure( 'running' ); + configure( 'running' ) local ufuncs = { @@ -609,9 +609,9 @@ function mci.term { [ 2 ] = 'INT', [ 15 ] = 'TERM' - }; + } - local sigtext = sigtexts[ sigcode ]; + local sigtext = sigtexts[ sigcode ] if not sigtext then sigtext = 'UNKNOWN' end diff --git a/mantle/signal.lua b/mantle/signal.lua index b593b74..f1486ef 100644 --- a/mantle/signal.lua +++ b/mantle/signal.lua @@ -29,9 +29,7 @@ end -- keys are signal numbers -- values are functions to be called -- or 'false' in case of disabled default signals --- --- On signal the core will directly look up this table. -mci.sigHandlers = { } +local sigHandlers = { } -- counter of signal handlers -- used to tell the core to enlarge the signal queue if needed @@ -74,7 +72,7 @@ local function onsignalPrep error( 'signal of type ' .. type( signal ) .. ' invalid.', 2 ) end - mci.sigHandlers[ signum ] = handler + sigHandlers[ signum ] = handler end -- @@ -89,7 +87,7 @@ function onsignal ) onsignalPrep( signal, handler ) - core.onsignal( mci.sigHandlers ) + core.onsignal( sigHandlers ) end @@ -105,24 +103,46 @@ function initSignalHandlers onsignalPrep( 'HUP', function( ) - console.log( 'GOT A HUP SIGNAL' ); + print( 'GOT A HUP SIGNAL' ) end ) onsignalPrep( 'INT', function( ) - console.log( 'GOT A INT SIGNAL' ); + print( 'GOT A INT SIGNAL' ) end ) onsignalPrep( 'TERM', function( ) - console.log( 'GOT A TERM SIGNAL' ); + print( 'GOT A TERM SIGNAL' ) end ) - core.onsignal( mci.sigHandlers ) + core.onsignal( sigHandlers ) +end + + +-- +-- Called by kernel on catched and queued signals +-- +mci.signalEvent = + function +( + sigtable +) + for _, signum in ipairs( sigtable ) + do + local handler = sigHandlers[ signum ] + + if not handler + then + log( 'Error', 'Received signal '..signnum..' without a handler.' ) + end + + handler( ) + end end