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

Reply via email to