reworking the signal system

This commit is contained in:
Axel Kittenberger 2018-04-28 14:32:56 +02:00
parent 8377a2d6a4
commit 0425ff230c
4 changed files with 113 additions and 9 deletions

View File

@ -65,6 +65,7 @@ set( MANTLE_CODE
${PROJECT_SOURCE_DIR}/mantle/syncmaster.lua
${PROJECT_SOURCE_DIR}/mantle/monitor.lua
${PROJECT_SOURCE_DIR}/mantle/fwriter.lua
${PROJECT_SOURCE_DIR}/mantle/signal.lua
${PROJECT_SOURCE_DIR}/mantle/statusfile.lua
${PROJECT_SOURCE_DIR}/mantle/useralarm.lua
${PROJECT_SOURCE_DIR}/mantle/mci.lua

View File

@ -386,14 +386,6 @@ function mci.initialize
firstTime -- true when Lsyncd startups the first time,
-- -- false on resets, due to HUP signal or monitor queue overflow.
)
print( 'HELLO' )
do
for num, name in pairs( signames )
do
print( 'SIG', num, name )
end
end
-- Checks if user overwrote the settings function.
-- ( was Lsyncd <2.1 style )
if userENV.settings ~= settings
@ -407,6 +399,8 @@ function mci.initialize
os.exit( -1 )
end
initSignalHandlers( firstTime )
lastReportedWaiting = false
--

105
mantle/signal.lua Normal file
View File

@ -0,0 +1,105 @@
--
-- signal.lua from Lsyncd -- the Live (Mirror) Syncing Demon
--
--
-- Handles signal handlers.
--
--
-- License: GPLv2 (see COPYING) or any later version
-- Authors: Axel Kittenberger <axkibe@gmail.com>
--
if mantle
then
print( 'Error, Lsyncd mantle already loaded' )
os.exit( -1 )
end
-- "signames" is a a (mantle-)global table from signames.lua created by the
-- build script following code creates a (hash)table for the other direction.
local signums = { }
for num, name in pairs( signames )
do
signums[ name ] = num
end
-- a table of all registered signal handlers
local sigHandlers = { }
-- counter of signal handlers
-- used to tell the core to enlarge the signal queue if needed
-- (the queue must be as large as the number of different signals listened for)
local sigHandlerCount = 0
--
-- onsignal function exported to userEnv
--
function onsignal
(
signal, -- signal number or name
handler -- function to call
-- -- or nil to unload the handle
-- -- or false to disable default signal handlers
)
local signum
if type( signal ) == 'number'
then
if signal < 0
or signal ~= signal
or signal - floor( signal ) ~= 0
then
error( 'signal ' .. signal .. ' is an invalid number.' , 2 )
end
signum = signal
elseif type( signal ) == 'string'
then
signum = signums[ signal ]
if signum == nil
then
error( 'signal "' .. signal .. '" unknown.' , 2 )
end
else
error( 'signal of type ' .. type( signal ) .. ' invalid.', 2 )
end
-- FIXME store the handler in a table
-- FIXME tell core of max queue size
core.onsignal( signum, handler );
end
--
-- Sets up the default HUP/INT/TERM signal handlers.
--
-- Called after user scripts finished
--
function initSignalHandlers
(
firstTime --- TODO check if needed
)
onsignal(
'HUP',
function( )
console.log( 'GOT A HUP SIGNAL' );
end
)
onsignal(
'INT',
function( )
console.log( 'GOT A INT SIGNAL' );
end
)
onsignal(
'TERM',
function( )
console.log( 'GOT A TERM SIGNAL' );
end
)
end

View File

@ -11,6 +11,9 @@
#
KILL=/bin/kill
# Don't know a better way, checks only until this signal number
# To quote, this ought to be enough for anybody.
nmax=256
if [ "$#" -ne 1 ];
then
@ -28,13 +31,14 @@ echo "signames =" >> $1
echo "{" >> $1
n=1
while name=`kill -l $n 2>/dev/null`;
while name=`$KILL --list=$n 2>/dev/null`;
do
if ! [ -z $name ]
then
echo $echoe "\t[ $n ] = '$name'," >> $1
fi
n=$(( n + 1 ))
if [ $n -gt $nmax ]; then break; fi
done
echo "}" >> $1