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>
This commit is contained in:
parent
0c3fd6eb14
commit
6ecf99a708
2 changed files with 36 additions and 3 deletions
|
@ -9,11 +9,14 @@
|
|||
|
||||
#include <cstdint>
|
||||
|
||||
#include <libcamera/object.h>
|
||||
#include <libcamera/signal.h>
|
||||
|
||||
namespace libcamera {
|
||||
|
||||
class Timer
|
||||
class Message;
|
||||
|
||||
class Timer : public Object
|
||||
{
|
||||
public:
|
||||
Timer();
|
||||
|
@ -28,7 +31,13 @@ public:
|
|||
|
||||
Signal<Timer *> timeout;
|
||||
|
||||
protected:
|
||||
void message(Message *msg) override;
|
||||
|
||||
private:
|
||||
void registerTimer();
|
||||
void unregisterTimer();
|
||||
|
||||
unsigned int interval_;
|
||||
uint64_t deadline_;
|
||||
};
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue