From c382cc832847c6f687f6d1d4f61a7a5c3b5275ea Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Sat, 30 Jul 2016 09:25:57 +0000 Subject: timecounter: Merge FreeBSD change r303548 Cache getbintime(9) answer in timehands, similarly to getnanotime(9) and getmicrotime(9). Suggested and reviewed by: bde (previous version) Sponsored by: The FreeBSD Foundation MFC after: 1 month Update #3175. --- cpukit/score/src/kern_tc.c | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) (limited to 'cpukit/score/src/kern_tc.c') diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c index efe2ee904a..78e1308188 100644 --- a/cpukit/score/src/kern_tc.c +++ b/cpukit/score/src/kern_tc.c @@ -151,6 +151,7 @@ struct timehands { uint64_t th_scale; uint32_t th_offset_count; struct bintime th_offset; + struct bintime th_bintime; struct timeval th_microtime; struct timespec th_nanotime; struct bintime th_boottime; @@ -175,6 +176,7 @@ static struct timehands th0 = { .th_offset = { .sec = 1 }, .th_generation = 1, #ifdef __rtems__ + .th_bintime = { .sec = TOD_SECONDS_1970_THROUGH_1988 }, .th_microtime = { TOD_SECONDS_1970_THROUGH_1988, 0 }, .th_nanotime = { TOD_SECONDS_1970_THROUGH_1988, 0 }, .th_boottime = { .sec = TOD_SECONDS_1970_THROUGH_1988 - 1 }, @@ -346,9 +348,8 @@ fbclock_bintime(struct bintime *bt) do { th = timehands; gen = atomic_load_acq_int(&th->th_generation); - *bt = th->th_offset; + *bt = th->th_bintime; bintime_addx(bt, th->th_scale * tc_delta(th)); - bintime_add(bt, &th->th_boottime); atomic_thread_fence_acq(); } while (gen == 0 || gen != th->th_generation); } @@ -422,8 +423,7 @@ fbclock_getbintime(struct bintime *bt) do { th = timehands; gen = atomic_load_acq_int(&th->th_generation); - *bt = th->th_offset; - bintime_add(bt, &th->th_boottime); + *bt = th->th_bintime; atomic_thread_fence_acq(); } while (gen == 0 || gen != th->th_generation); } @@ -517,9 +517,8 @@ bintime(struct bintime *bt) do { th = timehands; gen = atomic_load_acq_int(&th->th_generation); - *bt = th->th_offset; + *bt = th->th_bintime; bintime_addx(bt, th->th_scale * tc_delta(th)); - bintime_add(bt, &th->th_boottime); atomic_thread_fence_acq(); } while (gen == 0 || gen != th->th_generation); } @@ -593,8 +592,7 @@ getbintime(struct bintime *bt) do { th = timehands; gen = atomic_load_acq_int(&th->th_generation); - *bt = th->th_offset; - bintime_add(bt, &th->th_boottime); + *bt = th->th_bintime; atomic_thread_fence_acq(); } while (gen == 0 || gen != th->th_generation); } @@ -1567,6 +1565,8 @@ _Timecounter_Windup(struct bintime *new_boottimebin, if (bt.sec != t) th->th_boottime.sec += bt.sec - t; } + th->th_bintime = th->th_offset; + bintime_add(&th->th_bintime, &th->th_boottime); /* Update the UTC timestamps used by the get*() functions. */ /* XXX shouldn't do this here. Should force non-`get' versions. */ bintime2timeval(&bt, &th->th_microtime); @@ -2000,9 +2000,8 @@ pps_event(struct pps_state *pps, int event) /* Convert the count to a timespec. */ tcount = pps->capcount - pps->capth->th_offset_count; tcount &= pps->capth->th_counter->tc_counter_mask; - bt = pps->capth->th_offset; + bt = pps->capth->th_bintime; bintime_addx(&bt, pps->capth->th_scale * tcount); - bintime_add(&bt, &pps->capth->th_boottime); bintime2timespec(&bt, &ts); /* If the timecounter was wound up underneath us, bail out. */ @@ -2117,10 +2116,9 @@ _Timecounter_Tick_simple(uint32_t delta, uint32_t offset, bintime_addx(&th->th_offset, th->th_scale * delta); bt = th->th_offset; - th->th_bintime = bt; - bintime_add(&th->th_bintime, &th->th_boottime); + bintime_add(&bt, &th->th_boottime); /* Update the UTC timestamps used by the get*() functions. */ - /* XXX shouldn't do this here. Should force non-`get' versions. */ + th->th_bintime = bt; bintime2timeval(&bt, &th->th_microtime); bintime2timespec(&bt, &th->th_nanotime); -- cgit v1.2.3