22 #include <asio/io_context.hpp>
34 enum class loop_mode : int { stopped = 0, starting = 1, running = 2 };
35 static std::map<std::string, std::shared_ptr<AsioContextManager>>
37 std::atomic<int> runCounter{
40 std::unique_ptr<asio::io_context> ictx;
41 std::unique_ptr<asio::io_context::work>
43 bool leakOnDelete =
false;
44 std::atomic<loop_mode> running{loop_mode::stopped};
45 std::mutex runningLoopLock;
46 std::atomic<bool> terminateLoop{
false};
47 std::future<void> loopRet;
54 explicit Servicer(std::shared_ptr<AsioContextManager> manager):
55 contextManager(std::move(manager))
63 contextManager->haltContextLoop();
71 Servicer(Servicer&& sv) =
default;
74 std::shared_ptr<AsioContextManager> contextManager;
78 using LoopHandle = std::unique_ptr<Servicer>;
84 static std::shared_ptr<AsioContextManager>
91 static std::shared_ptr<AsioContextManager>
95 static asio::io_context&
getContext(
const std::string& contextName = std::string());
99 static asio::io_context&
getExistingContext(
const std::string& contextName = std::string());
101 static void closeContext(
const std::string& contextName = std::string());
113 const std::string&
getName()
const {
return name; }
124 static LoopHandle
runContextLoop(
const std::string& contextName = std::string{});
133 bool isRunning()
const {
return (running.load() != loop_mode::stopped); }
140 void haltContextLoop();
142 friend void contextProcessingLoop(std::shared_ptr<AsioContextManager> ptr);
145 void contextProcessingLoop(std::shared_ptr<AsioContextManager> ptr);