From a0c8fd49d410c02dbd153bf52863c046cb58d54d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kuba=20Szczodrzy=C5=84ski?= Date: Fri, 9 Feb 2024 20:45:53 +0100 Subject: [PATCH] Fix millis() overflow on 32-bit Linux --- src/dev/posix/hasp_posix.cpp | 11 +++++++++-- src/dev/posix/hasp_posix.h | 2 +- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/dev/posix/hasp_posix.cpp b/src/dev/posix/hasp_posix.cpp index 3b0c7566..e19e3c2e 100644 --- a/src/dev/posix/hasp_posix.cpp +++ b/src/dev/posix/hasp_posix.cpp @@ -248,11 +248,18 @@ long PosixDevice::get_uptime() } // namespace dev -long PosixMillis() +static time_t tv_sec_start = 0; + +unsigned long PosixMillis() { struct timespec spec; clock_gettime(CLOCK_REALTIME, &spec); - return (spec.tv_sec) * 1000 + (spec.tv_nsec) / 1e6; + if (tv_sec_start == 0) { + tv_sec_start = spec.tv_sec; + } + unsigned long msec1 = (spec.tv_sec - tv_sec_start) * 1000; + unsigned long msec2 = spec.tv_nsec / 1e6; + return msec1 + msec2; } void msleep(unsigned long millis) diff --git a/src/dev/posix/hasp_posix.h b/src/dev/posix/hasp_posix.h index 4ec64458..7e7d6275 100644 --- a/src/dev/posix/hasp_posix.h +++ b/src/dev/posix/hasp_posix.h @@ -75,7 +75,7 @@ class PosixDevice : public BaseDevice { } // namespace dev -extern long PosixMillis(); +extern unsigned long PosixMillis(); extern void msleep(unsigned long millis); using dev::PosixDevice;