diff options
author | Florent Le Coz <louiz@louiz.org> | 2014-05-29 01:30:04 +0200 |
---|---|---|
committer | Florent Le Coz <louiz@louiz.org> | 2014-05-28 17:31:28 +0200 |
commit | d9d30dd782870b2ab6584fb54b7c19a2a9ae4c78 (patch) | |
tree | 63a4ceae0a59286cdeb07bfb71d72029f7eeedb0 /src | |
parent | 5999e6e0c32e6897b88f59f0743b4bb1fc9c521c (diff) | |
download | biboumi-d9d30dd782870b2ab6584fb54b7c19a2a9ae4c78.tar.gz biboumi-d9d30dd782870b2ab6584fb54b7c19a2a9ae4c78.tar.bz2 biboumi-d9d30dd782870b2ab6584fb54b7c19a2a9ae4c78.tar.xz biboumi-d9d30dd782870b2ab6584fb54b7c19a2a9ae4c78.zip |
Use a timed event to force the exit 2 seconds after an exit signal is received
fix #2469
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/main.cpp b/src/main.cpp index 40825c9..b5abad9 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,4 +1,5 @@ #include <xmpp/xmpp_component.hpp> +#include <utils/timed_events.hpp> #include <network/poller.hpp> #include <config/config.hpp> #include <logger/logger.hpp> @@ -17,6 +18,13 @@ static volatile std::atomic<bool> reload(false); // flag is set and all connections are closed, we can exit properly. static bool exiting = false; +// The global (and only) TimedEventsManager. It can be accessed by any +// class to add new TimedEvents, and it is used in the main loop to provide +// a timeout to the poller, this way the method execute_expired_events can +// be called on time, without having to do an active “poll” on it every n +// seconds. +TimedEventsManager timed_events; + /** * Provide an helpful message to help the user write a minimal working * configuration file. @@ -32,8 +40,11 @@ int config_help(const std::string& missing_option) return 1; } -static void sigint_handler(int, siginfo_t*, void*) +static void sigint_handler(int sig, siginfo_t*, void*) { + // In 2 seconds, repeat the same signal, to force the exit + timed_events.add_event(TimedEvent(std::chrono::steady_clock::now() + 2s, + [sig]() { raise(sig); })); stop.store(true); } @@ -90,9 +101,10 @@ int main(int ac, char** av) xmpp_component->start(); - const std::chrono::milliseconds timeout(-1); + auto timeout = timed_events.get_timeout(); while (p->poll(timeout) != -1) { + timed_events.execute_expired_events(); // Check for empty irc_clients (not connected, or with no joined // channel) and remove them xmpp_component->clean(); @@ -131,6 +143,7 @@ int main(int ac, char** av) xmpp_component->close(); if (exiting && p->size() == 1 && xmpp_component->is_document_open()) xmpp_component->close_document(); + timeout = timed_events.get_timeout(); } log_info("All connection cleanely closed, have a nice day."); return 0; |