|
@@ -72,6 +72,7 @@ static DEFINE_SPINLOCK(hash_lock);
|
|
|
|
|
|
static const struct k_clock * const posix_clocks[];
|
|
|
static const struct k_clock *clockid_to_kclock(const clockid_t id);
|
|
|
+static const struct k_clock clock_realtime, clock_monotonic;
|
|
|
|
|
|
/*
|
|
|
* we assume that the new SIGEV_THREAD_ID shares no bits with the other
|
|
@@ -750,6 +751,18 @@ static void common_hrtimer_arm(struct k_itimer *timr, ktime_t expires,
|
|
|
enum hrtimer_mode mode;
|
|
|
|
|
|
mode = absolute ? HRTIMER_MODE_ABS : HRTIMER_MODE_REL;
|
|
|
+ /*
|
|
|
+ * Posix magic: Relative CLOCK_REALTIME timers are not affected by
|
|
|
+ * clock modifications, so they become CLOCK_MONOTONIC based under the
|
|
|
+ * hood. See hrtimer_init(). Update timr->kclock, so the generic
|
|
|
+ * functions which use timr->kclock->clock_get() work.
|
|
|
+ *
|
|
|
+ * Note: it_clock stays unmodified, because the next timer_set() might
|
|
|
+ * use ABSTIME, so it needs to switch back.
|
|
|
+ */
|
|
|
+ if (timr->it_clock == CLOCK_REALTIME)
|
|
|
+ timr->kclock = absolute ? &clock_realtime : &clock_monotonic;
|
|
|
+
|
|
|
hrtimer_init(&timr->it.real.timer, timr->it_clock, mode);
|
|
|
timr->it.real.timer.function = posix_timer_fn;
|
|
|
|