From 68f8584209f787e24d521e938d99dbd026628faf Mon Sep 17 00:00:00 2001 From: Benny Baumann <BenBE@geshi.org> Date: Sun, 26 Feb 2023 17:58:15 +0100 Subject: [PATCH] add: Allow to stop the event loop programmatically --- src/mumta/evloop.cpp | 19 ++++++++++++++++++- src/mumta/evloop.hpp | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/mumta/evloop.cpp b/src/mumta/evloop.cpp index 3b55825..896e610 100644 --- a/src/mumta/evloop.cpp +++ b/src/mumta/evloop.cpp @@ -31,7 +31,24 @@ struct stdin_waiter : std::enable_shared_from_this<stdin_waiter> void rmrf::ev::loop() { ::ev::default_loop defloop; - auto w = std::make_shared<stdin_waiter>(); + //auto w = std::make_shared<stdin_waiter>(); defloop.run(0); } + +void stop_default_loop_cb(EV_P_ ev_async* event, int) { + ::ev::loop_ref defloop = ::ev::get_default_loop(); + + ev_async_stop(defloop, event); + + defloop.break_loop(); +} + +void rmrf::ev::stop() { + ::ev::loop_ref defloop = ::ev::get_default_loop(); + // We need to use the C API directly as ev++ does not yet support asynchrounous events + ev_async stop_event; + ev_async_init(&stop_event, stop_default_loop_cb); + ev_async_start(defloop, &stop_event); + ev_async_send(defloop, &stop_event); +} diff --git a/src/mumta/evloop.hpp b/src/mumta/evloop.hpp index 7aac30e..d55b934 100644 --- a/src/mumta/evloop.hpp +++ b/src/mumta/evloop.hpp @@ -12,5 +12,6 @@ bool init_libev(); bool init_watchdog(); void loop(); +void stop(); } -- GitLab