From 6265122cea66ba91504ae3712d7f4efbe6233732 Mon Sep 17 00:00:00 2001 From: randomdan Date: Fri, 6 Sep 2013 22:39:56 +0000 Subject: Basics for p2daemons --- project2/Jamfile.jam | 7 ++++++- project2/common/options.h | 1 + project2/common/plugable.h | 2 ++ project2/daemon/Jamfile.jam | 15 ++++++++++++++ project2/daemon/lib/Jamfile.jam | 15 ++++++++++++++ project2/daemon/lib/daemon.cpp | 10 +++++++++ project2/daemon/lib/daemon.h | 20 ++++++++++++++++++ project2/daemon/p2daemonAppEngine.cpp | 39 +++++++++++++++++++++++++++++++++++ project2/daemon/p2daemonAppEngine.h | 29 ++++++++++++++++++++++++++ project2/daemon/p2daemonMain.cpp | 26 +++++++++++++++++++++++ 10 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 project2/daemon/Jamfile.jam create mode 100644 project2/daemon/lib/Jamfile.jam create mode 100644 project2/daemon/lib/daemon.cpp create mode 100644 project2/daemon/lib/daemon.h create mode 100644 project2/daemon/p2daemonAppEngine.cpp create mode 100644 project2/daemon/p2daemonAppEngine.h create mode 100644 project2/daemon/p2daemonMain.cpp diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index b2bd49a..c1a7c24 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -20,12 +20,17 @@ alias p2parts : : : : lib//p2lib ; +alias p2daemonparts : : : : + ; + build-project console ; build-project cgi ; +build-project daemon ; explicit install installp2con installp2cgi installp2fcgi ; -package.install install : : console//p2console cgi//p2cgi cgi//p2fcgi ; +package.install install : : console//p2console cgi//p2cgi cgi//p2fcgi daemon//p2daemon ; package.install installp2con : : console//p2console ; package.install installp2cgi : : cgi//p2cgi ; package.install installp2fcgi : : cgi//p2fcgi ; +package.install installp2daemon : : daemon//p2daemon ; diff --git a/project2/common/options.h b/project2/common/options.h index c2416ef..cee95d4 100644 --- a/project2/common/options.h +++ b/project2/common/options.h @@ -9,6 +9,7 @@ #include #include #include "variableType.h" +#include "plugable.h" class Options { public: diff --git a/project2/common/plugable.h b/project2/common/plugable.h index 74a2019..4b46f8c 100644 --- a/project2/common/plugable.h +++ b/project2/common/plugable.h @@ -8,6 +8,8 @@ #include #include "exceptions.h" +class ComponentLoader; + class Plugable { public: template diff --git a/project2/daemon/Jamfile.jam b/project2/daemon/Jamfile.jam new file mode 100644 index 0000000..123e6fc --- /dev/null +++ b/project2/daemon/Jamfile.jam @@ -0,0 +1,15 @@ +alias glibmm : : : : + "`pkg-config --cflags glibmm-2.4`" + "`pkg-config --libs glibmm-2.4`" + ; +exe p2daemon : + [ glob *.cpp ] + : + lib + ..//p2parts + ..//p2daemonparts + ../common//p2common + ../cli//p2cli + ../../libmisc + ; + diff --git a/project2/daemon/lib/Jamfile.jam b/project2/daemon/lib/Jamfile.jam new file mode 100644 index 0000000..e028f19 --- /dev/null +++ b/project2/daemon/lib/Jamfile.jam @@ -0,0 +1,15 @@ +alias glibmm : : : : + "`pkg-config --cflags glibmm-2.4`" + "`pkg-config --libs glibmm-2.4`" + ; +lib p2daemonlib : + [ glob *.cpp ] + : + ../../../libmisc + glibmm + ../../common//p2common + : : + . + ; + + diff --git a/project2/daemon/lib/daemon.cpp b/project2/daemon/lib/daemon.cpp new file mode 100644 index 0000000..1a70fc1 --- /dev/null +++ b/project2/daemon/lib/daemon.cpp @@ -0,0 +1,10 @@ +#include "daemon.h" + +Daemon::Daemon() +{ +} + +Daemon::~Daemon() +{ +} + diff --git a/project2/daemon/lib/daemon.h b/project2/daemon/lib/daemon.h new file mode 100644 index 0000000..106d3f4 --- /dev/null +++ b/project2/daemon/lib/daemon.h @@ -0,0 +1,20 @@ +#ifndef DAEMON_H +#define DAEMON_H + +#include +#include +#include + +class Daemon : public IntrusivePtrBase { + public: + Daemon(); + virtual ~Daemon(); + + virtual void process() const = 0; +}; + +typedef boost::intrusive_ptr DaemonPtr; +typedef GenLoader DaemonLoader; + +#endif + diff --git a/project2/daemon/p2daemonAppEngine.cpp b/project2/daemon/p2daemonAppEngine.cpp new file mode 100644 index 0000000..62bcff7 --- /dev/null +++ b/project2/daemon/p2daemonAppEngine.cpp @@ -0,0 +1,39 @@ +#include "p2daemonAppEngine.h" +#include +#include + +std::string DaemonAppEngine::daemonType; +boost::optional DaemonAppEngine::libraryPath; +Glib::ustring DaemonAppEngine::reqPlatform; + +DECLARE_OPTIONS(DaemonAppEngine, "Project2 Daemon options") +("daemon.type", Options::value(&daemonType), "The core daemon module to run") +("daemon.library", Options::value(&libraryPath), "The optional library containing the core daemon to load") +("daemon.platform", Options::value(&reqPlatform), "Platform") +END_OPTIONS(DaemonAppEngine); + +DaemonAppEngine::DaemonAppEngine(int argc, char ** argv) : + library(!!libraryPath ? loadLibrary(*libraryPath) : boost::shared_ptr()), + daemon(DaemonLoader::createNew(daemonType, argc, argv)) +{ +} + +void +DaemonAppEngine::process() const +{ + Logger()->message(LOG_INFO, "Starting daemon."); + daemon->process(); + Logger()->message(LOG_INFO, "Daemon exitted."); +} + +boost::shared_ptr +DaemonAppEngine::loadLibrary(const std::string & path) +{ + void * handle = dlopen(path.c_str(), RTLD_NOW); + if (!handle) { + Logger()->messagebf(LOG_ERR, "Failed to load library '%s' (%s)", path, dlerror()); + throw std::runtime_error("module load failed"); + } + return boost::shared_ptr(handle, &dlclose); +} + diff --git a/project2/daemon/p2daemonAppEngine.h b/project2/daemon/p2daemonAppEngine.h new file mode 100644 index 0000000..a74f34a --- /dev/null +++ b/project2/daemon/p2daemonAppEngine.h @@ -0,0 +1,29 @@ +#ifndef DAEMONAPPENGINE_H +#define DAEMONAPPENGINE_H + +#include +#include +#include "lib/daemon.h" + +class DaemonAppEngine { + public: + DaemonAppEngine(int, char **); + ~DaemonAppEngine() = default; + + void process() const; + + INITOPTIONS; + + static Glib::ustring reqPlatform; + static std::string daemonType; + static boost::optional libraryPath; + + private: + static boost::shared_ptr loadLibrary(const std::string & path); + + boost::shared_ptr library; + DaemonPtr daemon; +}; + +#endif + diff --git a/project2/daemon/p2daemonMain.cpp b/project2/daemon/p2daemonMain.cpp new file mode 100644 index 0000000..2399827 --- /dev/null +++ b/project2/daemon/p2daemonMain.cpp @@ -0,0 +1,26 @@ +#include "pch.hpp" +#include "p2daemonAppEngine.h" +#include "optionsSource.h" +#include "claOptions.h" +#include +#include + +SimpleMessageException(UnsupportedArguments); + +int +main(int argc, char ** argv) +{ + Plugable::onAllComponents(boost::bind(&ComponentLoader::onBegin, _1)); + Plugable::newLoader("_2", new CommandLineArguments(argc, argv, + [](const char * a) { throw UnsupportedArguments(a); })); + OptionsSource::loadSources([] { return DaemonAppEngine::reqPlatform;} ); + //Plugable::onAllComponents(boost::bind(&ComponentLoader::onBefore, _1)); + + DaemonAppEngine dae(argc, argv); + dae.process(); + + //Plugable::onAllComponents(boost::bind(&ComponentLoader::onIteration, _1)); + //Plugable::onAllComponents(boost::bind(&ComponentLoader::onPeriodic, _1)); + Plugable::onAllComponents(boost::bind(&ComponentLoader::onIdle, _1)); +} + -- cgit v1.2.3