diff options
author | Damien Zammit <damien@zamaudio.com> | 2025-09-21 09:14:04 +0000 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2025-09-21 18:46:09 +0200 |
commit | c33f27196d9cb072d48bf5389bb64ad99a0d735a (patch) | |
tree | af845d5d8325378677d1c9583356c3e16d57d1b8 /kern/task.c | |
parent | 8d456cd9e417e9787481df15736b5f1c55cbc870 (diff) |
mach_clock: Fix monotonic clock sometimes going backwards
Between reading mtime and reading hpclock_read_counter,
there may be an interrupt that updates mtime, therefore
we need a check to perform the clock read process again
in this case.
TESTED: on UP using:
```
\#include <stdio.h>
\#include <time.h>
int main()
{
struct timespec ts, now;
int i;
int cnt = 0;
clock_gettime(CLOCK_MONOTONIC, &ts);
for (i = 0; i < 10000000; i++) {
clock_gettime(CLOCK_MONOTONIC, &now);
if ((now.tv_nsec < ts.tv_nsec) && (now.tv_sec <= ts.tv_sec)) {
printf("BACKWARDS\n");
cnt++;
printf(" %u %09lu\n %u %09lu\n\n",
ts.tv_sec, ts.tv_nsec,
now.tv_sec, now.tv_nsec
);
}
ts = now;
}
printf("went backwards %d out of %d times\n", cnt, i);
return 0;
}
```
Before the change, some backward transitions were detected.
After this change, none were detected.
Message-ID: <20250921091345.2183347-1-damien@zamaudio.com>
Diffstat (limited to 'kern/task.c')
0 files changed, 0 insertions, 0 deletions