diff options
-rw-r--r-- | project2/daemon/lib/daemon.h | 3 | ||||
-rw-r--r-- | project2/daemon/p2daemonAppEngine.cpp | 30 | ||||
-rw-r--r-- | project2/daemon/p2daemonAppEngine.h | 3 |
3 files changed, 31 insertions, 5 deletions
diff --git a/project2/daemon/lib/daemon.h b/project2/daemon/lib/daemon.h index 106d3f4..ca57b5d 100644 --- a/project2/daemon/lib/daemon.h +++ b/project2/daemon/lib/daemon.h @@ -10,7 +10,8 @@ class Daemon : public IntrusivePtrBase { Daemon(); virtual ~Daemon(); - virtual void process() const = 0; + virtual void run() const = 0; + virtual void shutdown() const = 0; }; typedef boost::intrusive_ptr<Daemon> DaemonPtr; diff --git a/project2/daemon/p2daemonAppEngine.cpp b/project2/daemon/p2daemonAppEngine.cpp index 62bcff7..d00cd1d 100644 --- a/project2/daemon/p2daemonAppEngine.cpp +++ b/project2/daemon/p2daemonAppEngine.cpp @@ -5,6 +5,7 @@ std::string DaemonAppEngine::daemonType; boost::optional<std::string> DaemonAppEngine::libraryPath; Glib::ustring DaemonAppEngine::reqPlatform; +DaemonPtr DaemonAppEngine::daemon; DECLARE_OPTIONS(DaemonAppEngine, "Project2 Daemon options") ("daemon.type", Options::value(&daemonType), "The core daemon module to run") @@ -13,16 +14,38 @@ DECLARE_OPTIONS(DaemonAppEngine, "Project2 Daemon options") END_OPTIONS(DaemonAppEngine); DaemonAppEngine::DaemonAppEngine(int argc, char ** argv) : - library(!!libraryPath ? loadLibrary(*libraryPath) : boost::shared_ptr<void>()), - daemon(DaemonLoader::createNew(daemonType, argc, argv)) + library(!!libraryPath ? loadLibrary(*libraryPath) : boost::shared_ptr<void>()) { + daemon = DaemonLoader::createNew(daemonType, argc, argv); +} + +void +DaemonAppEngine::shutdown(int) +{ + if (signal(SIGINT, SIG_DFL) == SIG_ERR) { + Logger()->message(LOG_WARNING, "Failed to remove signal handler"); + } + if (signal(SIGTERM, SIG_DFL) == SIG_ERR) { + Logger()->message(LOG_WARNING, "Failed to remove signal handler"); + } + + Logger()->message(LOG_INFO, "Shutting down daemon."); + daemon->shutdown(); + Logger()->message(LOG_INFO, "Daemon shut down."); } void DaemonAppEngine::process() const { + if (signal(SIGINT, &shutdown) == SIG_ERR) { + Logger()->message(LOG_WARNING, "Failed to add signal handler"); + } + if (signal(SIGTERM, &shutdown) == SIG_ERR) { + Logger()->message(LOG_WARNING, "Failed to add signal handler"); + } + Logger()->message(LOG_INFO, "Starting daemon."); - daemon->process(); + daemon->run(); Logger()->message(LOG_INFO, "Daemon exitted."); } @@ -37,3 +60,4 @@ DaemonAppEngine::loadLibrary(const std::string & path) return boost::shared_ptr<void>(handle, &dlclose); } + diff --git a/project2/daemon/p2daemonAppEngine.h b/project2/daemon/p2daemonAppEngine.h index a74f34a..48ef572 100644 --- a/project2/daemon/p2daemonAppEngine.h +++ b/project2/daemon/p2daemonAppEngine.h @@ -22,7 +22,8 @@ class DaemonAppEngine { static boost::shared_ptr<void> loadLibrary(const std::string & path); boost::shared_ptr<void> library; - DaemonPtr daemon; + static void shutdown(int); + static DaemonPtr daemon; }; #endif |