summaryrefslogtreecommitdiff
path: root/src/init.cpp
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2012-12-13 06:12:56 -0500
committerAdam <Adam@anope.org>2012-12-13 06:12:56 -0500
commitc1077faa281c5635f85b892e605e23bd6c8fcc3b (patch)
tree213b5f87a19f182e1efd6110f03ff10d5b10ebf6 /src/init.cpp
parent76ba147c22944b67e8522cd2bb7b6e1bae498ced (diff)
Optimize much of the database code and serialize code.
Diffstat (limited to 'src/init.cpp')
-rw-r--r--src/init.cpp181
1 files changed, 91 insertions, 90 deletions
diff --git a/src/init.cpp b/src/init.cpp
index e45d2a6f9..14e7d2025 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -16,7 +16,6 @@
#include "protocol.h"
#include "bots.h"
#include "xline.h"
-#include "signals.h"
#include "socketengine.h"
#include "servers.h"
#include "language.h"
@@ -91,91 +90,6 @@ static bool GetCommandLineArgument(const Anope::string &name, char shortname = 0
return GetCommandLineArgument(name, shortname, Unused);
}
-/*************************************************************************/
-
-/* Remove our PID file. Done at exit. */
-
-static void remove_pidfile()
-{
- remove(Config->PIDFilename.c_str());
-}
-
-/*************************************************************************/
-
-/* Create our PID file and write the PID to it. */
-
-static void write_pidfile()
-{
- FILE *pidfile = fopen(Config->PIDFilename.c_str(), "w");
- if (pidfile)
- {
-#ifdef _WIN32
- fprintf(pidfile, "%d\n", static_cast<int>(GetCurrentProcessId()));
-#else
- fprintf(pidfile, "%d\n", static_cast<int>(getpid()));
-#endif
- fclose(pidfile);
- atexit(remove_pidfile);
- }
- else
- throw CoreException("Can not write to PID file " + Config->PIDFilename);
-}
-
-/*************************************************************************/
-
-class SignalReload : public Signal
-{
- public:
- SignalReload(int sig) : Signal(sig) { }
-
- void OnNotify()
- {
- Log() << "Received SIGHUP: Saving databases & rehashing configuration";
-
- Anope::SaveDatabases();
-
- ServerConfig *old_config = Config;
- try
- {
- Config = new ServerConfig();
- FOREACH_MOD(I_OnReload, OnReload());
- delete old_config;
- }
- catch (const ConfigException &ex)
- {
- Config = old_config;
- Log() << "Error reloading configuration file: " << ex.GetReason();
- }
- }
-};
-
-class SignalExit : public Signal
-{
- public:
- SignalExit(int sig) : Signal(sig) { }
-
- void OnNotify()
- {
-#ifndef _WIN32
- Log() << "Received " << strsignal(this->signal) << " signal (" << this->signal << "), exiting.";
- Anope::QuitReason = Anope::string("Services terminating via signal ") + strsignal(this->signal) + " (" + stringify(this->signal) + ")";
-#else
- Log() << "Received signal " << this->signal << ", exiting.";
- Anope::QuitReason = Anope::string("Services terminating via signal ") + stringify(this->signal);
-#endif
- Anope::SaveDatabases();
- Anope::Quitting = true;
- }
-};
-
-class SignalNothing : public Signal
-{
- public:
- SignalNothing(int sig) : Signal(sig) { }
-
- void OnNotify() { }
-};
-
bool Anope::AtTerm()
{
return isatty(fileno(stdout)) && isatty(fileno(stdin)) && isatty(fileno(stderr));
@@ -196,6 +110,45 @@ void Anope::Fork()
#endif
}
+void Anope::HandleSignal()
+{
+ switch (Signal)
+ {
+ case SIGHUP:
+ {
+ Anope::SaveDatabases();
+
+ ServerConfig *old_config = Config;
+ try
+ {
+ Config = new ServerConfig();
+ FOREACH_MOD(I_OnReload, OnReload());
+ delete old_config;
+ }
+ catch (const ConfigException &ex)
+ {
+ Config = old_config;
+ Log() << "Error reloading configuration file: " << ex.GetReason();
+ }
+ break;
+ }
+ case SIGTERM:
+ case SIGINT:
+#ifndef _WIN32
+ Log() << "Received " << strsignal(Signal) << " signal (" << Signal << "), exiting.";
+ Anope::QuitReason = Anope::string("Services terminating via signal ") + strsignal(Signal) + " (" + stringify(Signal) + ")";
+#else
+ Log() << "Received signal " << Signal << ", exiting.";
+ Anope::QuitReason = Anope::string("Services terminating via signal ") + stringify(Signal);
+#endif
+ Anope::SaveDatabases();
+ Anope::Quitting = true;
+ break;
+ }
+
+ Signal = 0;
+}
+
#ifndef _WIN32
static void parent_signal_handler(int signal)
{
@@ -215,6 +168,57 @@ static void parent_signal_handler(int signal)
}
#endif
+static void SignalHandler(int sig)
+{
+ Anope::Signal = sig;
+}
+
+static void InitSignals()
+{
+ struct sigaction sa;
+
+ sa.sa_flags = 0;
+ sigemptyset(&sa.sa_mask);
+
+ sa.sa_handler = SignalHandler;
+
+ sigaction(SIGHUP, &sa, NULL);
+
+ sigaction(SIGTERM, &sa, NULL);
+ sigaction(SIGINT, &sa, NULL);
+
+ sa.sa_handler = SIG_IGN;
+
+ sigaction(SIGCHLD, &sa, NULL);
+ sigaction(SIGPIPE, &sa, NULL);
+}
+
+/* Remove our PID file. Done at exit. */
+
+static void remove_pidfile()
+{
+ remove(Config->PIDFilename.c_str());
+}
+
+/* Create our PID file and write the PID to it. */
+
+static void write_pidfile()
+{
+ FILE *pidfile = fopen(Config->PIDFilename.c_str(), "w");
+ if (pidfile)
+ {
+#ifdef _WIN32
+ fprintf(pidfile, "%d\n", static_cast<int>(GetCurrentProcessId()));
+#else
+ fprintf(pidfile, "%d\n", static_cast<int>(getpid()));
+#endif
+ fclose(pidfile);
+ atexit(remove_pidfile);
+ }
+ else
+ throw CoreException("Can not write to PID file " + Config->PIDFilename);
+}
+
void Anope::Init(int ac, char **av)
{
/* Set file creation mask and group ID. */
@@ -432,10 +436,7 @@ void Anope::Init(int ac, char **av)
/* Announce ourselves to the logfile. */
Log() << "Anope " << Anope::Version() << " starting up" << (Anope::Debug || Anope::ReadOnly ? " (options:" : "") << (Anope::Debug ? " debug" : "") << (Anope::ReadOnly ? " readonly" : "") << (Anope::Debug || Anope::ReadOnly ? ")" : "");
- new SignalReload(SIGHUP);
- new SignalExit(SIGTERM);
- new SignalExit(SIGINT);
- new SignalNothing(SIGPIPE);
+ InitSignals();
/* Initialize multi-language support */
Language::InitLanguages();