[libcamera-devel,v2,03/18] libcamera: thread: Support dispatching messages to main thread

Message ID 20190817152104.10834-4-laurent.pinchart@ideasonboard.com
State Accepted
Headers show
Series
  • Object & Thread enhancements
Related show

Commit Message

Laurent Pinchart Aug. 17, 2019, 3:20 p.m. UTC
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>
---
 src/libcamera/event_dispatcher_poll.cpp | 3 +++
 src/libcamera/include/thread.h          | 3 ++-
 src/libcamera/thread.cpp                | 4 +---
 3 files changed, 6 insertions(+), 4 deletions(-)

Patch

diff --git a/src/libcamera/event_dispatcher_poll.cpp b/src/libcamera/event_dispatcher_poll.cpp
index 4f15f3e3269b..281f37bdbb16 100644
--- a/src/libcamera/event_dispatcher_poll.cpp
+++ b/src/libcamera/event_dispatcher_poll.cpp
@@ -19,6 +19,7 @@ 
 #include <libcamera/timer.h>
 
 #include "log.h"
+#include "thread.h"
 
 /**
  * \file event_dispatcher_poll.h
@@ -143,6 +144,8 @@  void EventDispatcherPoll::processEvents()
 {
 	int ret;
 
+	Thread::current()->dispatchMessages();
+
 	/* Create the pollfd array. */
 	std::vector<struct pollfd> pollfds;
 	pollfds.reserve(notifiers_.size() + 1);
diff --git a/src/libcamera/include/thread.h b/src/libcamera/include/thread.h
index acae91cb6457..630abb49534f 100644
--- a/src/libcamera/include/thread.h
+++ b/src/libcamera/include/thread.h
@@ -43,6 +43,8 @@  public:
 	EventDispatcher *eventDispatcher();
 	void setEventDispatcher(std::unique_ptr<EventDispatcher> dispatcher);
 
+	void dispatchMessages();
+
 protected:
 	int exec();
 	virtual void run();
@@ -53,7 +55,6 @@  private:
 
 	void postMessage(std::unique_ptr<Message> msg, Object *receiver);
 	void removeMessages(Object *receiver);
-	void dispatchMessages();
 
 	friend class Object;
 	friend class ThreadData;
diff --git a/src/libcamera/thread.cpp b/src/libcamera/thread.cpp
index 6f86e4a90a05..24422f7b7bd0 100644
--- a/src/libcamera/thread.cpp
+++ b/src/libcamera/thread.cpp
@@ -212,10 +212,8 @@  int Thread::exec()
 
 	locker.unlock();
 
-	while (!data_->exit_.load(std::memory_order_acquire)) {
-		dispatchMessages();
+	while (!data_->exit_.load(std::memory_order_acquire))
 		dispatcher->processEvents();
-	}
 
 	locker.lock();