diff options
Diffstat (limited to 'src/cam')
-rw-r--r-- | src/cam/event_loop.cpp | 40 | ||||
-rw-r--r-- | src/cam/event_loop.h | 9 |
2 files changed, 23 insertions, 26 deletions
diff --git a/src/cam/event_loop.cpp b/src/cam/event_loop.cpp index 3a2b665a..6a4c47f2 100644 --- a/src/cam/event_loop.cpp +++ b/src/cam/event_loop.cpp @@ -38,25 +38,13 @@ EventLoop *EventLoop::instance() int EventLoop::exec() { exitCode_ = -1; - exit_.store(false, std::memory_order_release); - - while (!exit_.load(std::memory_order_acquire)) { - dispatchCalls(); - event_base_loop(base_, EVLOOP_NO_EXIT_ON_EMPTY); - } - + event_base_loop(base_, EVLOOP_NO_EXIT_ON_EMPTY); return exitCode_; } void EventLoop::exit(int code) { exitCode_ = code; - exit_.store(true, std::memory_order_release); - interrupt(); -} - -void EventLoop::interrupt() -{ event_base_loopbreak(base_); } @@ -67,20 +55,28 @@ void EventLoop::callLater(const std::function<void()> &func) calls_.push_back(func); } - interrupt(); + event_base_once(base_, -1, EV_TIMEOUT, dispatchCallback, this, nullptr); } -void EventLoop::dispatchCalls() +void EventLoop::dispatchCallback([[maybe_unused]] evutil_socket_t fd, + [[maybe_unused]] short flags, void *param) { - std::unique_lock<std::mutex> locker(lock_); + EventLoop *loop = static_cast<EventLoop *>(param); + loop->dispatchCall(); +} - for (auto iter = calls_.begin(); iter != calls_.end(); ) { - std::function<void()> call = std::move(*iter); +void EventLoop::dispatchCall() +{ + std::function<void()> call; - iter = calls_.erase(iter); + { + std::unique_lock<std::mutex> locker(lock_); + if (calls_.empty()) + return; - locker.unlock(); - call(); - locker.lock(); + call = calls_.front(); + calls_.pop_front(); } + + call(); } diff --git a/src/cam/event_loop.h b/src/cam/event_loop.h index d0d5b5a5..ba3ba3a4 100644 --- a/src/cam/event_loop.h +++ b/src/cam/event_loop.h @@ -7,11 +7,12 @@ #ifndef __CAM_EVENT_LOOP_H__ #define __CAM_EVENT_LOOP_H__ -#include <atomic> #include <functional> #include <list> #include <mutex> +#include <event2/util.h> + struct event_base; class EventLoop @@ -31,14 +32,14 @@ private: static EventLoop *instance_; struct event_base *base_; - std::atomic<bool> exit_; int exitCode_; std::list<std::function<void()>> calls_; std::mutex lock_; - void interrupt(); - void dispatchCalls(); + static void dispatchCallback(evutil_socket_t fd, short flags, + void *param); + void dispatchCall(); }; #endif /* __CAM_EVENT_LOOP_H__ */ |