libcamera: thread: Support dispatching messages to main thread

Threads contain message queues and dispatch queued messages in their
event loop, in Thread::exec(). This mechanism prevents the main thread
from dispatching messages as it doesn't run Thread::exec().

Fix this by moving message dispatching from Thread::exec() to
EventDispatcher::processEvents().

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
This commit is contained in:
Laurent Pinchart 2019-08-12 03:35:35 +03:00
parent 391b184fc5
commit a66e5ca8c6
3 changed files with 6 additions and 4 deletions

View file

@ -19,6 +19,7 @@
#include <libcamera/timer.h> #include <libcamera/timer.h>
#include "log.h" #include "log.h"
#include "thread.h"
/** /**
* \file event_dispatcher_poll.h * \file event_dispatcher_poll.h
@ -143,6 +144,8 @@ void EventDispatcherPoll::processEvents()
{ {
int ret; int ret;
Thread::current()->dispatchMessages();
/* Create the pollfd array. */ /* Create the pollfd array. */
std::vector<struct pollfd> pollfds; std::vector<struct pollfd> pollfds;
pollfds.reserve(notifiers_.size() + 1); pollfds.reserve(notifiers_.size() + 1);

View file

@ -43,6 +43,8 @@ public:
EventDispatcher *eventDispatcher(); EventDispatcher *eventDispatcher();
void setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher); void setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher);
void dispatchMessages();
protected: protected:
int exec(); int exec();
virtual void run(); virtual void run();
@ -53,7 +55,6 @@ private:
void postMessage(std::unique_ptr<Message> msg, Object *receiver); void postMessage(std::unique_ptr<Message> msg, Object *receiver);
void removeMessages(Object *receiver); void removeMessages(Object *receiver);
void dispatchMessages();
friend class Object; friend class Object;
friend class ThreadData; friend class ThreadData;

View file

@ -212,10 +212,8 @@ int Thread::exec()
locker.unlock(); locker.unlock();
while (!data_->exit_.load(std::memory_order_acquire)) { while (!data_->exit_.load(std::memory_order_acquire))
dispatchMessages();
dispatcher->processEvents(); dispatcher->processEvents();
}
locker.lock(); locker.lock();