> On 07/04/2022 10:36, Gabriel Moyano wrote: > > --- > > cpukit/score/src/kern_tc.c | 6 ++++++ > > 1 file changed, 6 insertions(+) > > > > diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c > > index a5c7b4b841..a8ba268ea3 100644 > > --- a/cpukit/score/src/kern_tc.c > > +++ b/cpukit/score/src/kern_tc.c > > @@ -2109,9 +2109,11 @@ pps_capture(struct pps_state *pps) > > pps->capffth = fftimehands; > > #endif > > pps->capcount = th->th_counter->tc_get_timecount(th->th_counter); > > +#ifndef __rtems__ > > atomic_thread_fence_acq(); > > if (pps->capgen != th->th_generation) > > pps->capgen = 0; > > +#endif /* __rtems__ */ > > } > > > > void > > @@ -2135,10 +2137,12 @@ pps_event(struct pps_state *pps, int event) > > /* Nothing to do if not currently set to capture this event type. */ > > if ((event & pps->ppsparam.mode) == 0) > > return; > > +#ifndef __rtems__ > > /* If the timecounter was wound up underneath us, bail out. */ > > if (pps->capgen == 0 || pps->capgen != > > atomic_load_acq_int(&pps->capth->th_generation)) > > return; > > +#endif /* __rtems__ */ > > > > /* Things would be easier with arrays. */ > > if (event == PPS_CAPTUREASSERT) { > > @@ -2189,10 +2193,12 @@ pps_event(struct pps_state *pps, int event) > > bintime_addx(&bt, pps->capth->th_scale * tcount); > > bintime2timespec(&bt, &ts); > > > > +#ifndef __rtems__ > > /* If the timecounter was wound up underneath us, bail out. */ > > atomic_thread_fence_acq(); > > if (pps->capgen != pps->capth->th_generation) > > return; > > +#endif /* __rtems__ */ > > > > *pcount = pps->capcount; > > (*pseq)++; > > Why is this change justified?
Since only one timehands object is used, the generation is updated more frequently. This can even happen between pps_capture() and pps_event(), making the synchronization impossible. _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel