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:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user