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
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)

View File

@ -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;