[libcamera-devel] [PATCH 8/9] libcamera: timer: Add start() method with absolute deadline
Laurent Pinchart
laurent.pinchart at ideasonboard.com
Sun Oct 6 07:32:25 CEST 2019
The Timer class is started using a timer duration. To help callers that
require waiting for an absolute deadline, add a start() overload that
takes a std::chrono::steady_clock::time_point value. This will be used
by IPAs.
Signed-off-by: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
---
include/libcamera/timer.h | 1 +
src/libcamera/timer.cpp | 22 +++++++++++++++++++---
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/include/libcamera/timer.h b/include/libcamera/timer.h
index 3540efb41b6f..34e7b8ac8e87 100644
--- a/include/libcamera/timer.h
+++ b/include/libcamera/timer.h
@@ -25,6 +25,7 @@ public:
void start(unsigned int msec) { start(std::chrono::milliseconds(msec)); }
void start(std::chrono::milliseconds duration);
+ void start(std::chrono::steady_clock::time_point deadline);
void stop();
bool isRunning() const;
diff --git a/src/libcamera/timer.cpp b/src/libcamera/timer.cpp
index 8749d66c8662..705ce60b8fbd 100644
--- a/src/libcamera/timer.cpp
+++ b/src/libcamera/timer.cpp
@@ -37,6 +37,11 @@ LOG_DEFINE_CATEGORY(Timer)
* stop(), and once it times out or is stopped, can be started again with
* start().
*
+ * The timer deadline is specified as either a duration in milliseconds or an
+ * absolute time point. If the deadline is set to the past or the current time,
+ * the timer will time out immediately when execution returns to the event
+ * loop of the timer's thread.
+ *
* Timers run in the thread they belong to, and thus emit the \a ref timeout
* signal from that thread. To avoid race conditions they must not be started
* or stopped from a different thread, attempts to do so will be rejected and
@@ -74,17 +79,28 @@ Timer::~Timer()
* the timer is already running it will be stopped and restarted.
*/
void Timer::start(std::chrono::milliseconds duration)
+{
+ start(utils::clock::now() + duration);
+}
+
+/**
+ * \brief Start or restart the timer with a \a deadline
+ * \param[in] deadline The timer deadline
+ *
+ * This method shall be called from the thread the timer is associated with. If
+ * the timer is already running it will be stopped and restarted.
+ */
+void Timer::start(std::chrono::steady_clock::time_point deadline)
{
if (Thread::current() != thread()) {
LOG(Timer, Error) << "Timer can't be started from another thread";
return;
}
- deadline_ = utils::clock::now() + duration;
+ deadline_ = deadline;
LOG(Timer, Debug)
- << "Starting timer " << this << " with duration "
- << duration.count() << ": deadline "
+ << "Starting timer " << this << ": deadline "
<< utils::time_point_to_string(deadline_);
if (isRunning())
--
Regards,
Laurent Pinchart
More information about the libcamera-devel
mailing list