[PATCH v7] Test needed for timer_create with CLOCK_MONOTONI
Joel Sherrill
joel at rtems.org
Wed Aug 11 13:42:53 UTC 2021
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 <gedare at rtems.org> wrote:
>
> Joel: This looks fine to me.
>
> On Mon, Aug 9, 2021 at 3:58 PM Zacchaeus Leung <zakthertemsdev at 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 at rtems.org
> > http://lists.rtems.org/mailman/listinfo/devel
More information about the devel
mailing list