Fix millis() overflow on 32-bit Linux

This commit is contained in:
Kuba Szczodrzyński 2024-02-09 20:45:53 +01:00
parent a7d900ed7b
commit a0c8fd49d4
No known key found for this signature in database
GPG Key ID: 43037AC62A600562
2 changed files with 10 additions and 3 deletions

View File

@ -248,11 +248,18 @@ long PosixDevice::get_uptime()
} // namespace dev } // namespace dev
long PosixMillis() static time_t tv_sec_start = 0;
unsigned long PosixMillis()
{ {
struct timespec spec; struct timespec spec;
clock_gettime(CLOCK_REALTIME, &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) void msleep(unsigned long millis)

View File

@ -75,7 +75,7 @@ class PosixDevice : public BaseDevice {
} // namespace dev } // namespace dev
extern long PosixMillis(); extern unsigned long PosixMillis();
extern void msleep(unsigned long millis); extern void msleep(unsigned long millis);
using dev::PosixDevice; using dev::PosixDevice;