[libcamera-devel] [PATCH 3/5] libcamera: timer: Fix 32 bit wrap

Kieran Bingham kieran.bingham at ideasonboard.com
Thu Jan 17 21:20:41 CET 2019


The msec parameter was multiplied as a 32 bit value when converting to
nanosecond resolution. This wraps at 4.2949 seconds, and causes timers
longer than this to fail.

Fix the multiplication to upcast to 64 bit using an unsigned long long
specifier on the multiplier.

While we're here, initialise the two integer class members in the
constructor initialiser list.

Signed-off-by: Kieran Bingham <kieran.bingham at ideasonboard.com>
---
 src/libcamera/timer.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/libcamera/timer.cpp b/src/libcamera/timer.cpp
index b5212ba26869..306825fde3c0 100644
--- a/src/libcamera/timer.cpp
+++ b/src/libcamera/timer.cpp
@@ -36,6 +36,7 @@ namespace libcamera {
  * \brief Construct a timer
  */
 Timer::Timer()
+	: interval_(0), deadline_(0)
 {
 }
 
@@ -51,7 +52,7 @@ void Timer::start(unsigned int msec)
 	clock_gettime(CLOCK_MONOTONIC, &tp);
 
 	interval_ = msec;
-	deadline_ = tp.tv_sec * 1000000000ULL + tp.tv_nsec + msec * 1000000;
+	deadline_ = tp.tv_sec * 1000000000ULL + tp.tv_nsec + msec * 1000000ULL;
 
 	LOG(Debug) << "Starting timer " << this << " with interval " << msec
 		   << ": deadline " << deadline_;
-- 
2.17.1



More information about the libcamera-devel mailing list