From patchwork Sun Oct 6 05:32:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Laurent Pinchart X-Patchwork-Id: 2113 Return-Path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by lancelot.ideasonboard.com (Postfix) with ESMTPS id AC0B06196F for ; Sun, 6 Oct 2019 07:32:40 +0200 (CEST) Received: from pendragon.ideasonboard.com (modemcable151.96-160-184.mc.videotron.ca [184.160.96.151]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id E378B73E for ; Sun, 6 Oct 2019 07:32:39 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1570339960; bh=fzp/Klj2MQpQRsxLIaDQdaRrGuikhrbtdXkb7CRSdAo=; h=From:To:Subject:Date:In-Reply-To:References:From; b=ve9zUSNb9RHXdovg5cx0kRij8l1zA8UMPm0rJo1I5Jx4lrpJFPfCb9p/SRAYaIqKV 9f2YMAbKVxZ2KF1sZnRSPKxXfiW/wa5Gofm93kxkh39W8ErjXX634OFBtLk4ExqKl1 7w/BCznl3QQoC23STCRAFYvbXbDmjpdXKoK03c+U= From: Laurent Pinchart To: libcamera-devel@lists.libcamera.org Date: Sun, 6 Oct 2019 08:32:25 +0300 Message-Id: <20191006053226.8976-9-laurent.pinchart@ideasonboard.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20191006053226.8976-1-laurent.pinchart@ideasonboard.com> References: <20191006053226.8976-1-laurent.pinchart@ideasonboard.com> MIME-Version: 1.0 Subject: [libcamera-devel] [PATCH 8/9] libcamera: timer: Add start() method with absolute deadline X-BeenThere: libcamera-devel@lists.libcamera.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 06 Oct 2019 05:32:40 -0000 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: Jacopo Mondi --- 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())