[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