summaryrefslogtreecommitdiff
path: root/src
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:42 +0300
commit6ecf99a708936c4b7a33ad6296baa04e9975abb2 (patch)
treef9207396a308e2f3991970210eab8b4e1c5c0e13 /src
parent0c3fd6eb14fe83e62793eaed552529d21790195f (diff)
libcamera: timer: Bind timers to threads
The Timer instances are registered with the event dispatcher instance of the CameraManager. This makes it impossible to use timers 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>
Diffstat (limited to 'src')
-rw-r--r--src/libcamera/timer.cpp28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/libcamera/timer.cpp b/src/libcamera/timer.cpp
index 0dcb4e76..f45061d4 100644
--- a/src/libcamera/timer.cpp
+++ b/src/libcamera/timer.cpp
@@ -13,6 +13,8 @@
#include <libcamera/event_dispatcher.h>
#include "log.h"
+#include "message.h"
+#include "thread.h"
/**
* \file timer.h
@@ -66,7 +68,7 @@ void Timer::start(unsigned int msec)
<< "Starting timer " << this << " with interval "
<< msec << ": deadline " << deadline_;
- CameraManager::instance()->eventDispatcher()->registerTimer(this);
+ registerTimer();
}
/**
@@ -79,11 +81,21 @@ void Timer::start(unsigned int msec)
*/
void Timer::stop()
{
- CameraManager::instance()->eventDispatcher()->unregisterTimer(this);
+ unregisterTimer();
deadline_ = 0;
}
+void Timer::registerTimer()
+{
+ thread()->eventDispatcher()->registerTimer(this);
+}
+
+void Timer::unregisterTimer()
+{
+ thread()->eventDispatcher()->unregisterTimer(this);
+}
+
/**
* \brief Check if the timer is running
* \return True if the timer is running, false otherwise
@@ -112,4 +124,16 @@ bool Timer::isRunning() const
* The timer pointer is passed as a parameter.
*/
+void Timer::message(Message *msg)
+{
+ if (msg->type() == Message::ThreadMoveMessage) {
+ if (deadline_) {
+ unregisterTimer();
+ invokeMethod(&Timer::registerTimer);
+ }
+ }
+
+ Object::message(msg);
+}
+
} /* namespace libcamera */