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