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>
This commit is contained in:
Laurent Pinchart
2019-08-11 15:42:18 +03:00
parent b566e97aac
commit 0c3fd6eb14
2 changed files with 23 additions and 2 deletions

View File

@@ -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_;

View File

@@ -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 */