From 9d250417a2583c2cad663fe3d8a93959182e3b2b Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Sun, 6 Oct 2019 06:42:09 +0300 Subject: libcamera: timer: Add start() method with absolute deadline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Niklas Söderlund Reviewed-by: Jacopo Mondi --- src/libcamera/timer.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'src/libcamera/timer.cpp') 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 @@ -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()) -- cgit v1.2.1