[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