summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-06 06:42:09 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-10-07 06:14:49 +0300
commit9d250417a2583c2cad663fe3d8a93959182e3b2b (patch)
treed87f00c05f70cb53c1383df3fcfb6b77319fb564
parentada18bf65a1c343b6994bfd9f23b39aae8d9a9c5 (diff)
libcamera: timer: Add start() method with absolute deadline
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@ideasonboard.com> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
-rw-r--r--include/libcamera/timer.h1
-rw-r--r--src/libcamera/timer.cpp22
2 files changed, 20 insertions, 3 deletions
diff --git a/include/libcamera/timer.h b/include/libcamera/timer.h
index 3540efb4..34e7b8ac 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 8749d66c..ddb20954 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 current time or to the
+ * past, 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
@@ -75,16 +80,27 @@ Timer::~Timer()
*/
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())