From f70495a48646e54272783b4b709aca0396cb85f8 Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Fri, 26 Nov 2021 08:19:58 +0100 Subject: Create daemon module and use it from server Need to run setup() after forking, otherwise each TaskRunner created in setup() will dead-lock at exit as there are now two copies of each of them but not of the threads causing the destructors to lock. This made setup a little bit more complicated as it has to forward the log and status to parent process but I turned out quite nice. --- src/daemon.hh | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/daemon.hh (limited to 'src/daemon.hh') diff --git a/src/daemon.hh b/src/daemon.hh new file mode 100644 index 0000000..10f0584 --- /dev/null +++ b/src/daemon.hh @@ -0,0 +1,45 @@ +#ifndef DAEMON_HH +#define DAEMON_HH + +#include + +class Logger; + +class Daemon { +public: + virtual ~Daemon() = default; + + // Method is called after forking; + // if it returns true then parent process will detach and return success and + // run is executed. + // if it returns false then parent process will exit in failure and run is + // never executed. + // Anything logged to logger will write to calling logger regardless of return + // value. + // Note that stdin, stdout and stderr are all closed when this runs, you + // must use logger object if you want to output anything. + // Current directory is not modified. + virtual bool setup(Logger* logger) = 0; + + // Method is called after forking and only after setup returns true. + // Note that stdin, stdout and stderr are all closed when this runs. + // Current directory is changed to root. + virtual bool run() = 0; + + // Forks, runs setup() method before returning true or false. + // If setup() returns true then so does this method and run() is called. + // If setup() returns false then so does this method and run() is never + // called. + static bool fork_in_background(Logger* logger, + std::unique_ptr daemon); + + // Doesn't fork, just runs setup() and if it returns true then + // also run() and waits for it to return. + static bool run_in_foreground(Logger* logger, + std::unique_ptr daemon); + +protected: + Daemon() = default; +}; + +#endif // DAEMON_HH -- cgit v1.2.3-70-g09d2