> On 29/04/2022 09:20, Gabriel Moyano wrote: > > --- > > cpukit/include/sys/timepps.h | 6 ++++++ > > cpukit/score/src/kern_tc.c | 25 +++++++++++++++++++++++++ > > 2 files changed, 31 insertions(+) > > > > diff --git a/cpukit/include/sys/timepps.h > > b/cpukit/include/sys/timepps.h index 5703381ffa..0d666a4f2e 100644 > > --- a/cpukit/include/sys/timepps.h > > +++ b/cpukit/include/sys/timepps.h > > @@ -26,6 +26,7 @@ > > #include <sys/time.h> > > #ifdef __rtems__ > > #include <rtems/score/atomic.h> > > +#include <rtems/rtems/types.h> > > #endif /* __rtems__ */ > > > > #define PPS_API_VERS_1 1 > > @@ -164,6 +165,11 @@ struct pps_state { > > int ppscap; > > struct timecounter *ppstc; > > unsigned ppscount[3]; > > +#ifdef __rtems__ > > + rtems_id task_waiting; > > You don't need task_waiting, this is an implementation detail of potential > wait/wakeup implementations.
What do you think here of replacing it with a void* because some variable is required to save the tasks waiting > > + int (*wait)(struct pps_state *pps, struct timespec timeout); /* Wait > > for an event. Called internally when time_pps_fetch() is > used. It shall not be NULL*/ > > + void (*wakeup)(struct pps_state *pps); /* Used to wakeup tasks > > + waiting for an event. It shall not be NULL*/ > > Please fix the formatting and take care that you keep the line limit. > > > +#endif /* __rtems__ */ > > /* > > * The following fields are valid if the driver calls pps_init_abi(). > > */ > > diff --git a/cpukit/score/src/kern_tc.c b/cpukit/score/src/kern_tc.c > > index f7d0a0b4ba..76e3e056de 100644 > > --- a/cpukit/score/src/kern_tc.c > > +++ b/cpukit/score/src/kern_tc.c > > @@ -1917,9 +1917,15 @@ abi_aware(struct pps_state *pps, int vers) > > static int > > pps_fetch(struct pps_fetch_args *fapi, struct pps_state *pps) > > { > > +#ifndef __rtems__ > > int err, timo; > > +#else /* __rtems__ */ > > + int err; > > +#endif /* __rtems__ */ > > pps_seq_t aseq, cseq; > > +#ifndef __rtems__ > > struct timeval tv; > > +#endif /* __rtems__ */ > > > > if (fapi->tsformat && fapi->tsformat != PPS_TSFMT_TSPEC) > > return (EINVAL); > > @@ -1932,6 +1938,7 @@ pps_fetch(struct pps_fetch_args *fapi, struct > > pps_state *pps) > > * sleep a long time. > > */ > > if (fapi->timeout.tv_sec || fapi->timeout.tv_nsec) { > > +#ifndef __rtems__ > > if (fapi->timeout.tv_sec == -1) > > timo = 0x7fffffff; > > else { > > @@ -1939,10 +1946,12 @@ pps_fetch(struct pps_fetch_args *fapi, struct > > pps_state *pps) > > tv.tv_usec = fapi->timeout.tv_nsec / 1000; > > timo = tvtohz(&tv); > > } > > +#endif /* __rtems__ */ > > aseq = atomic_load_int(&pps->ppsinfo.assert_sequence); > > cseq = atomic_load_int(&pps->ppsinfo.clear_sequence); > > while (aseq == atomic_load_int(&pps->ppsinfo.assert_sequence) && > > cseq == atomic_load_int(&pps->ppsinfo.clear_sequence)) { > > +#ifndef __rtems__ > > if (abi_aware(pps, 1) && pps->driver_mtx != NULL) { > > if (pps->flags & PPSFLAG_MTX_SPIN) { > > err = msleep_spin(pps, pps->driver_mtx, > > @@ -1954,6 +1963,12 @@ > > pps_fetch(struct pps_fetch_args *fapi, struct pps_state *pps) > > } else { > > err = tsleep(pps, PCATCH, "ppsfch", timo); > > } > > +#else /* __rtems__ */ > > + if (pps->wait != NULL) > > + err = (*pps->wait)(pps, fapi->timeout); > > + else > > + err = EAGAIN; > > +#endif /* __rtems__ */ > > Replace the NULL check with an _Assert(). Check in pps_init() that the > handler are not NULL, otherwise generate a new fatal error. > You need tests for the fatal errors. Actually the synchronization can work without these functions; wait() is called in pps_time_fetch() and wakeup() wakes up the waiting task(s). This is also why there is one _Assert() in pps_init() but if you consider better to add other for wait(), it can be done. > > if (err == EWOULDBLOCK) { > > if (fapi->timeout.tv_sec == -1) { > > continue; > > @@ -2061,6 +2076,11 @@ pps_ioctl(u_long cmd, caddr_t data, struct pps_state > > *pps) > > void > > pps_init(struct pps_state *pps) > > { > > +#ifdef __rtems__ > > + if (pps->wait != NULL) > > + _Assert(pps->wakeup != NULL); > > + pps->task_waiting = RTEMS_INVALID_ID; #endif /* __rtems__ */ > > pps->ppscap |= PPS_TSFMT_TSPEC | PPS_CANWAIT; > > if (pps->ppscap & PPS_CAPTUREASSERT) > > pps->ppscap |= PPS_OFFSETASSERT; > > @@ -2227,7 +2247,12 @@ pps_event(struct pps_state *pps, int event) > > #endif > > > > /* Wakeup anyone sleeping in pps_fetch(). */ > > +#ifndef __rtems__ > > wakeup(pps); > > +#else /* __rtems__ */ > > + if (pps->wakeup != NULL) > > + (*pps->wakeup)(pps); > > +#endif /* __rtems__ */ > > Add an _Assert() and just call pps->wakeup. > > > } > > #else /* __rtems__ */ > > /* FIXME: https://devel.rtems.org/ticket/2349 */ > _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel