summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-08-11 15:42:18 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-08-17 18:32:38 +0300
commit0c3fd6eb14fe83e62793eaed552529d21790195f (patch)
treef584806387e8d732275e962d9e8d25cd9731082c
parentb566e97aacd4d4c023526671bafc371ed2eca2c3 (diff)
libcamera: event_notifier: Bind event notifiers to threads
The EventNotifier instances are registered with the event dispatcher instance of the CameraManager. This makes it impossible to use event notifiers in other threads. Fix this by inheriting from Object, which allows binding instances to a thread, and register them with the event dispatcher for the thread they are bound to. 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>
-rw-r--r--include/libcamera/event_notifier.h8
-rw-r--r--src/libcamera/event_notifier.cpp17
2 files changed, 23 insertions, 2 deletions
diff --git a/include/libcamera/event_notifier.h b/include/libcamera/event_notifier.h
index 1e9b6da1..f80945c7 100644
--- a/include/libcamera/event_notifier.h
+++ b/include/libcamera/event_notifier.h
@@ -7,11 +7,14 @@
#ifndef __LIBCAMERA_EVENT_NOTIFIER_H__
#define __LIBCAMERA_EVENT_NOTIFIER_H__
+#include <libcamera/object.h>
#include <libcamera/signal.h>
namespace libcamera {
-class EventNotifier
+class Message;
+
+class EventNotifier : public Object
{
public:
enum Type {
@@ -31,6 +34,9 @@ public:
Signal<EventNotifier *> activated;
+protected:
+ void message(Message *msg) override;
+
private:
int fd_;
Type type_;
diff --git a/src/libcamera/event_notifier.cpp b/src/libcamera/event_notifier.cpp
index b32c7ed2..96be2760 100644
--- a/src/libcamera/event_notifier.cpp
+++ b/src/libcamera/event_notifier.cpp
@@ -10,6 +10,9 @@
#include <libcamera/camera_manager.h>
#include <libcamera/event_dispatcher.h>
+#include "message.h"
+#include "thread.h"
+
/**
* \file event_notifier.h
* \brief File descriptor event notifier
@@ -103,7 +106,7 @@ void EventNotifier::setEnabled(bool enable)
enabled_ = enable;
- EventDispatcher *dispatcher = CameraManager::instance()->eventDispatcher();
+ EventDispatcher *dispatcher = thread()->eventDispatcher();
if (enable)
dispatcher->registerEventNotifier(this);
else
@@ -119,4 +122,16 @@ void EventNotifier::setEnabled(bool enable)
* parameter.
*/
+void EventNotifier::message(Message *msg)
+{
+ if (msg->type() == Message::ThreadMoveMessage) {
+ if (enabled_) {
+ setEnabled(false);
+ invokeMethod(&EventNotifier::setEnabled, true);
+ }
+ }
+
+ Object::message(msg);
+}
+
} /* namespace libcamera */