Zack.. this doesn't apply for me. Can you compress it and send it to me privately as an attachment? That will eliminate the chance an email client AND the mail list archive have corrupted it.
Thanks. --joel On Mon, Aug 9, 2021 at 5:04 PM Gedare Bloom <ged...@rtems.org> wrote: > > Joel: This looks fine to me. > > On Mon, Aug 9, 2021 at 3:58 PM Zacchaeus Leung <zakthertems...@gmail.com> > wrote: > > > > Closes #3889 > > --- > > cpukit/include/rtems/posix/timer.h | 1 + > > cpukit/posix/src/psxtimercreate.c | 3 +- > > cpukit/posix/src/timergettime.c | 50 ++++++++++++------- > > testsuites/psxtests/psxtimer02/psxtimer.c | 26 ++++++++++ > > testsuites/psxtests/psxtimer02/psxtimer02.scn | 6 +++ > > 5 files changed, 66 insertions(+), 20 deletions(-) > > > > diff --git a/cpukit/include/rtems/posix/timer.h > > b/cpukit/include/rtems/posix/timer.h > > index bcbf07a65a..7ae089173a 100644 > > --- a/cpukit/include/rtems/posix/timer.h > > +++ b/cpukit/include/rtems/posix/timer.h > > @@ -48,6 +48,7 @@ typedef struct { > > uint32_t ticks; /* Number of ticks of the initialization */ > > uint32_t overrun; /* Number of expirations of the timer */ > > struct timespec time; /* Time at which the timer was started */ > > + clockid_t clock_type; /* The type of timer */ > > } POSIX_Timer_Control; > > > > /** > > diff --git a/cpukit/posix/src/psxtimercreate.c > > b/cpukit/posix/src/psxtimercreate.c > > index a63cf1d100..2b5a10140f 100644 > > --- a/cpukit/posix/src/psxtimercreate.c > > +++ b/cpukit/posix/src/psxtimercreate.c > > @@ -40,7 +40,7 @@ int timer_create( > > { > > POSIX_Timer_Control *ptimer; > > > > - if ( clock_id != CLOCK_REALTIME ) > > + if ( clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC ) > > rtems_set_errno_and_return_minus_one( EINVAL ); > > > > if ( !timerid ) > > @@ -91,6 +91,7 @@ int timer_create( > > ptimer->timer_data.it_value.tv_nsec = 0; > > ptimer->timer_data.it_interval.tv_sec = 0; > > ptimer->timer_data.it_interval.tv_nsec = 0; > > + ptimer->clock_type = clock_id; > > > > _Watchdog_Preinitialize( &ptimer->Timer, _Per_CPU_Get_snapshot() ); > > _Watchdog_Initialize( &ptimer->Timer, _POSIX_Timer_TSR ); > > diff --git a/cpukit/posix/src/timergettime.c > > b/cpukit/posix/src/timergettime.c > > index ee2a566f0e..2ad841d517 100644 > > --- a/cpukit/posix/src/timergettime.c > > +++ b/cpukit/posix/src/timergettime.c > > @@ -28,6 +28,7 @@ > > #include <rtems/score/todimpl.h> > > #include <rtems/score/watchdogimpl.h> > > #include <rtems/seterr.h> > > +#include <rtems/timespec.h> > > > > /* > > * - When a timer is initialized, the value of the time in > > @@ -39,35 +40,46 @@ > > int timer_gettime( > > timer_t timerid, > > struct itimerspec *value > > ) > > { > > POSIX_Timer_Control *ptimer; > > - ISR_lock_Context lock_context; > > - uint64_t now; > > - uint32_t remaining; > > + ISR_lock_Context lock_context; > > + Per_CPU_Control *cpu; > > + struct timespec now; > > + struct timespec expire; > > + struct timespec result; > > > > if ( !value ) > > rtems_set_errno_and_return_minus_one( EINVAL ); > > > > ptimer = _POSIX_Timer_Get( timerid, &lock_context ); > > - if ( ptimer != NULL ) { > > - Per_CPU_Control *cpu; > > + if ( ptimer == NULL ) { > > + rtems_set_errno_and_return_minus_one( EINVAL ); > > + } > > > > - cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context ); > > - now = cpu->Watchdog.ticks; > > + cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context ); > > + rtems_timespec_from_ticks( ptimer->Timer.expire, &expire ); > > > > - if ( now < ptimer->Timer.expire ) { > > - remaining = (uint32_t) ( ptimer->Timer.expire - now ); > > - } else { > > - remaining = 0; > > - } > > + if ( ptimer->clock_type == CLOCK_MONOTONIC ) { > > + _Timecounter_Nanouptime( &now ); > > + } else if ( ptimer->clock_type == CLOCK_REALTIME ) { > > + _TOD_Get( &now ); > > + } else { > > + _POSIX_Timer_Release( cpu, &lock_context ); > > + rtems_set_errno_and_return_minus_one( EINVAL ); > > + } > > > > - _Timespec_From_ticks( remaining, &value->it_value ); > > - value->it_interval = ptimer->timer_data.it_interval; > > > > - _POSIX_Timer_Release( cpu, &lock_context ); > > - return 0; > > + if ( rtems_timespec_less_than( &now, &expire ) ) { > > + rtems_timespec_subtract( &now, &expire, &result ); > > + } else { > > + result.tv_nsec = 0; > > + result.tv_sec = 0; > > } > > - > > - rtems_set_errno_and_return_minus_one( EINVAL ); > > + > > + value->it_value = result; > > + value->it_interval = ptimer->timer_data.it_interval; > > + > > + _POSIX_Timer_Release( cpu, &lock_context ); > > + return 0; > > } > > diff --git a/testsuites/psxtests/psxtimer02/psxtimer.c > > b/testsuites/psxtests/psxtimer02/psxtimer.c > > index 9f79d33c42..1a79369efb 100644 > > --- a/testsuites/psxtests/psxtimer02/psxtimer.c > > +++ b/testsuites/psxtests/psxtimer02/psxtimer.c > > @@ -126,6 +126,32 @@ void *POSIX_Init ( > > puts( "timer_delete - bad id - EINVAL" ); > > status = timer_delete( timer ); > > fatal_posix_service_status_errno( status, EINVAL, "bad id" ); > > + > > + puts( "timer_create (monotonic) - bad timer id pointer - EINVAL" ); > > + status = timer_create( CLOCK_MONOTONIC, &event, NULL ); > > + fatal_posix_service_status_errno( status, EINVAL, "bad timer id" ); > > + > > + puts( "timer_create (monotonic) - OK" ); > > + status = timer_create( CLOCK_MONOTONIC, NULL, &timer ); > > + posix_service_failed( status, "timer_create OK" ); > > + > > + puts( "timer_create (monotonic) - too many - EAGAIN" ); > > + status = timer_create( CLOCK_MONOTONIC, NULL, &timer1 ); > > + fatal_posix_service_status_errno( status, EAGAIN, "too many" ); > > + > > + clock_gettime( CLOCK_MONOTONIC, &now ); > > + itimer.it_value = now; > > + itimer.it_value.tv_sec = itimer.it_value.tv_sec - 1; > > + puts( "timer_settime (monotonic) - bad itimer value - previous time - > > EINVAL" ); > > + status = timer_settime( timer, TIMER_ABSTIME, &itimer, NULL ); > > + fatal_posix_service_status_errno( status, EINVAL, "bad itimer value #3" > > ); > > + > > + clock_gettime( CLOCK_MONOTONIC, &now ); > > + itimer.it_value = now; > > + itimer.it_value.tv_sec = itimer.it_value.tv_sec + 1; > > + puts( "timer_settime (monotonic) - bad id - EINVAL" ); > > + status = timer_settime( timer1, TIMER_ABSTIME, &itimer, NULL ); > > + fatal_posix_service_status_errno( status, EINVAL, "bad id" ); > > > > TEST_END(); > > rtems_test_exit (0); > > diff --git a/testsuites/psxtests/psxtimer02/psxtimer02.scn > > b/testsuites/psxtests/psxtimer02/psxtimer02.scn > > index e78425a32e..995bcda4e3 100644 > > --- a/testsuites/psxtests/psxtimer02/psxtimer02.scn > > +++ b/testsuites/psxtests/psxtimer02/psxtimer02.scn > > @@ -13,4 +13,10 @@ timer_settime - bad itimer value - negative nanosecond - > > EINVAL > > timer_settime - bad clock value - EINVAL > > timer_delete - OK > > timer_delete - bad id - EINVAL > > +timer_create (monotonic) - bad timer id pointer - EINVAL > > +timer_create (monotonic) - OK > > +timer_create (monotonic) - too many - EAGAIN > > +timer_settime (monotonic) - bad itimer value - previous time - EINVAL > > +timer_settime (monotonic) - bad id - EINVAL > > *** END OF POSIX Timers Test 02 *** > > -- > > 2.32.0 > > > > _______________________________________________ > > 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