From 63ab7c61e4d8fb80df7e79afa3dd56d04f74fa51 Mon Sep 17 00:00:00 2001 From: nocturn9x Date: Sat, 4 Dec 2021 18:12:22 +0100 Subject: [PATCH] More work to fix multiprocessing issues --- src/core/mainloop.nim | 2 ++ src/core/services.nim | 2 +- src/core/shutdown.nim | 3 +-- src/main.nim | 4 +--- src/util/misc.nim | 34 ++++++++++++++++++++++++++++++++++ 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/core/mainloop.nim b/src/core/mainloop.nim index 884eede..dfb6b85 100644 --- a/src/core/mainloop.nim +++ b/src/core/mainloop.nim @@ -24,6 +24,8 @@ proc mainLoop*(logger: Logger) = ## NimD's main execution loop logger.info("Processing default runlevel") startServices(logger, workers=1, level=Default) + logger.debug(&"Unblocking signals") + unblockSignals(logger) logger.info("System initialization complete, going idle") while true: try: diff --git a/src/core/services.nim b/src/core/services.nim index b74babb..1018180 100644 --- a/src/core/services.nim +++ b/src/core/services.nim @@ -198,4 +198,4 @@ proc startServices*(logger: Logger, level: RunLevel, workers: int = 1) = servicesCopy.del(0) quit(0) else: - discard waitPid(cint(pid), status, WUNTRACED) + discard waitPid(cint(pid), status, WUNTRACED) \ No newline at end of file diff --git a/src/core/shutdown.nim b/src/core/shutdown.nim index 96bd6ef..f467874 100644 --- a/src/core/shutdown.nim +++ b/src/core/shutdown.nim @@ -20,7 +20,6 @@ import times import ../util/logging -import ../util/misc type ShutdownHandler* = ref object @@ -104,7 +103,7 @@ proc nimDExit*(logger: Logger, code: int, emerg: bool = true) = var t = cpuTime() # We wait some time for the signals to propagate while anyUserlandProcessLeft() or cpuTime() - t >= sigTermDelay: - sleepSeconds(0.25) + sleep(int(0.25 * 1000)) if anyUserlandProcessLeft(): logger.info("Terminating child processes with SIGKILL") discard posix.kill(SIGKILL, -1) diff --git a/src/main.nim b/src/main.nim index 2b14d2d..4263764 100644 --- a/src/main.nim +++ b/src/main.nim @@ -21,7 +21,6 @@ import util/[logging, constants, misc] import core/[mainloop, fs, shutdown, services] - proc main(logger: Logger, mountDisks: bool = true, fstab: string = "/etc/fstab") = ## NimD's entry point and setup ## function @@ -96,8 +95,7 @@ proc main(logger: Logger, mountDisks: bool = true, fstab: string = "/etc/fstab") logger.info("Creating directories") createDirectories(logger) logger.debug("Entering critical fork() section: blocking signals") - var sigset: Sigset - # TODO + blockSignals(logger) logger.info("Processing boot runlevel") addService(newService(name="echoer", description="prints owo", exec="/bin/echo owo", runlevel=Boot, kind=Oneshot, workDir=getCurrentDir(), diff --git a/src/util/misc.nim b/src/util/misc.nim index a2d3892..f1c1364 100644 --- a/src/util/misc.nim +++ b/src/util/misc.nim @@ -22,6 +22,7 @@ import posix import logging +import ../core/shutdown proc sleepSeconds*(amount: SomeNumber) = sleep(int(amount * 1000)) @@ -33,6 +34,39 @@ proc doSync*(logger: Logger) = logger.debug(&"Calling sync() syscall has returned {syscall(SYNC)}") +proc dummySigHandler(x: cint) {.noconv.} = discard + + +proc blockSignals*(logger: Logger) = + ## Temporarily blocks all signals + ## for critical sections of code + + var tmp: Sigset + var sigaction: Sigaction + sigaction.sa_handler = dummySigHandler + sigaction.sa_flags = SA_RESTART + if posix.sigfillset(sigaction.sa_mask) == -1: + logger.fatal(&"Could not initialize signal lock (code {posix.errno}, {posix.strerror(posix.errno)}): environment is not safe, exiting now!") + nimDExit(logger, 131) + if posix.sigprocmask(SIG_SETMASK, sigaction.sa_mask, tmp) == -1: + logger.fatal(&"Could not apply signal mask to process (code {posix.errno}, {posix.strerror(posix.errno)}): environment is not safe, exiting now!") + nimDExit(logger, 131) + + +proc unblockSignals*(logger: Logger) = + ## Unblocks all signals + var tmp: Sigset + var sigaction: Sigaction + sigaction.sa_handler = dummySigHandler + sigaction.sa_flags = SA_RESTART + if posix.sigemptyset(sigaction.sa_mask) == -1: + logger.fatal(&"Could not initialize signal unlock (code {posix.errno}, {posix.strerror(posix.errno)}): environment is not safe, exiting now!") + nimDExit(logger, 131) + if posix.sigprocmask(SIG_SETMASK, sigaction.sa_mask, tmp) == -1: + logger.fatal(&"Could not apply signal mask to process (code {posix.errno}, {posix.strerror(posix.errno)}): environment is not safe, exiting now!") + nimDExit(logger, 131) + + proc reapProcess*(logger: Logger) = ## Reaps zombie processes. Note: This does not ## handle restarting crashed service processes,