Hi Joel, Something about the critical section logic here bugs me, see my crude analysis below:
On Thu, Mar 12, 2020 at 2:00 PM Joel Sherrill <j...@rtems.org> wrote: > > --- > cpukit/posix/src/pthreadgetcpuclockid.c | 31 ++++++++++++++++++++++++++----- > 1 file changed, 26 insertions(+), 5 deletions(-) > > diff --git a/cpukit/posix/src/pthreadgetcpuclockid.c > b/cpukit/posix/src/pthreadgetcpuclockid.c > index cd7814b..c15962e 100644 > --- a/cpukit/posix/src/pthreadgetcpuclockid.c > +++ b/cpukit/posix/src/pthreadgetcpuclockid.c > @@ -7,8 +7,10 @@ > > /* > * 20.1.6 Accessing a Thread CPU-time Clock, P1003.4b/Draft 8, p. 58 > - * > - * COPYRIGHT (c) 1989-2007. > + */ > + > +/* > + * COPYRIGHT (c) 1989-2007,2020. > * On-Line Applications Research Corporation (OAR). > * > * The license and distribution terms for this file may be > @@ -23,12 +25,31 @@ > #include <pthread.h> > #include <errno.h> > > -#include <rtems/seterr.h> > +#include <rtems/score/threadimpl.h> > > int pthread_getcpuclockid( > - pthread_t pid, > + pthread_t thread, > clockid_t *clock_id > ) > { > - rtems_set_errno_and_return_minus_one( ENOSYS ); > + Thread_Control *the_thread; > + ISR_lock_Context lock_context; > + > + if ( clock_id == NULL ) { > + return EINVAL; > + } > + > + the_thread = _Thread_Get( thread, &lock_context ); > + This lock_context now holds an ISR lock > + if ( the_thread == NULL ) { > + return ESRCH; > + } > + > + _Thread_State_acquire_critical( the_thread, &lock_context ); > + In SMP the lock_context is now overwritten by the thread's TQ lock. > + *clock_id = the_thread->Object.id; > + > + _Thread_State_release( the_thread, &lock_context ); Releasing the TQ lock > + > + return 0; Leaking the ISR lock, returning with ISRs disabled. > } > -- > 1.8.3.1 > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel