cam: event_loop: Add deferred calls support
Add a deferred cals queue to the EventLoop class to support queuing calls from a different thread and processing them in the event loop's thread. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
+28
-1
@@ -40,8 +40,10 @@ int EventLoop::exec()
|
||||
exitCode_ = -1;
|
||||
exit_.store(false, std::memory_order_release);
|
||||
|
||||
while (!exit_.load(std::memory_order_acquire))
|
||||
while (!exit_.load(std::memory_order_acquire)) {
|
||||
dispatchCalls();
|
||||
event_base_loop(event_, EVLOOP_NO_EXIT_ON_EMPTY);
|
||||
}
|
||||
|
||||
return exitCode_;
|
||||
}
|
||||
@@ -57,3 +59,28 @@ void EventLoop::interrupt()
|
||||
{
|
||||
event_base_loopbreak(event_);
|
||||
}
|
||||
|
||||
void EventLoop::callLater(const std::function<void()> &func)
|
||||
{
|
||||
{
|
||||
std::unique_lock<std::mutex> locker(lock_);
|
||||
calls_.push_back(func);
|
||||
}
|
||||
|
||||
interrupt();
|
||||
}
|
||||
|
||||
void EventLoop::dispatchCalls()
|
||||
{
|
||||
std::unique_lock<std::mutex> locker(lock_);
|
||||
|
||||
for (auto iter = calls_.begin(); iter != calls_.end(); ) {
|
||||
std::function<void()> call = std::move(*iter);
|
||||
|
||||
iter = calls_.erase(iter);
|
||||
|
||||
locker.unlock();
|
||||
call();
|
||||
locker.lock();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
#define __CAM_EVENT_LOOP_H__
|
||||
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <list>
|
||||
#include <mutex>
|
||||
|
||||
struct event_base;
|
||||
|
||||
@@ -22,6 +25,8 @@ public:
|
||||
int exec();
|
||||
void exit(int code = 0);
|
||||
|
||||
void callLater(const std::function<void()> &func);
|
||||
|
||||
private:
|
||||
static EventLoop *instance_;
|
||||
|
||||
@@ -29,7 +34,11 @@ private:
|
||||
std::atomic<bool> exit_;
|
||||
int exitCode_;
|
||||
|
||||
std::list<std::function<void()>> calls_;
|
||||
std::mutex lock_;
|
||||
|
||||
void interrupt();
|
||||
void dispatchCalls();
|
||||
};
|
||||
|
||||
#endif /* __CAM_EVENT_LOOP_H__ */
|
||||
|
||||
Reference in New Issue
Block a user