Re: [PATCH v3] Test needed for timer_create with CLOCK_MONOTONIC

2021-08-07 Thread Joel Sherrill
On Sat, Aug 7, 2021 at 10:57 AM Gedare Bloom  wrote:
>
> On Fri, Aug 6, 2021 at 11:55 AM zack leung  wrote:
> >
> > How do i report the findings of the  psx and  tests?
> >
>
> You can just copy-paste the final part of the log file when you run
> rtems-test. Or you can share the full log file as attachment

I also asked that Zack try to run coverage. I don't mind merging this
before he gets those results. But since he is on sparc, sis can do
coverage, so it is not a far reach. And he can be sure the test covers
the new code added completely.

timergettime.c reports as not having an end of line at the end of the
file. It is missing
a carriage return. Just hit enter and then make sure there isn't a
blank line at the end
of the file.

> >
> > Thanks
> > Zack
> >
> > On Thu, 5 Aug 2021 at 19:23, Gedare Bloom  wrote:
> >>
> >> On Thu, Aug 5, 2021 at 12:36 PM Zacchaeus Leung
> >>  wrote:
> >> >
> >> > the timer_create() method can use CLOCK_MONOTONIC but there was  no test 
> >> > for this
> >> >
> >> The commit message needs to be improved, because this patch is doing
> >> more than adding a "test", it is implementing the functionality to
> >> create a CLOCK_MONOTONIC timer and to gettime() on it.
> >>
> >> > Closes #3888
> >> https://devel.rtems.org/ticket/3888  ??
> >>
> >> >
> >> > ---
> >>
> >> [...]
> >>
> >> > +
> >> > + if ( rtems_timespec_less_than( &now, &expire ) ) {
> >> > +  rtems_timespec_subtract( &now, &expire, &result );
> >> > +} else {
> >> > +  result.tv_nsec = 0;
> >> > +  result.tv_sec  = 0;
> >> > +}
> >> The indentation level is wrong in this block.
> >>
> >> > +
> >> > +  value->it_value = result;
> >> > +  value->it_interval = ptimer->timer_data.it_interval;
> >> > +
> >> > +  _POSIX_Timer_Release( cpu, &lock_context );
> >> > +  return 0;
> >> > +}
> >> > \ No newline at end of file
> >> > 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" );
> >> >
> >>
> >> Please provide updated psxtimer02.scn and report the results for
> >> running rtems-test for at least the sparc/erc32 with sis including the
> >> sptests and psxtests. If you need help how to run rtems-test, consult
> >> the documentation and ask questions.
> >> https://docs.rtems.org/branches/master/user/testing/index.html
> >>
> >> >TEST_END();
> >> >rtems_test_exit (0);
> >> > --
> >> > 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
___
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel


Re: [PATCH v3] Test needed for timer_create with CLOCK_MONOTONIC

2021-08-07 Thread Gedare Bloom
On Fri, Aug 6, 2021 at 11:55 AM zack leung  wrote:
>
> How do i report the findings of the  psx and  tests?
>

You can just copy-paste the final part of the log file when you run
rtems-test. Or you can share the full log file as attachment

>
> Thanks
> Zack
>
> On Thu, 5 Aug 2021 at 19:23, Gedare Bloom  wrote:
>>
>> On Thu, Aug 5, 2021 at 12:36 PM Zacchaeus Leung
>>  wrote:
>> >
>> > the timer_create() method can use CLOCK_MONOTONIC but there was  no test 
>> > for this
>> >
>> The commit message needs to be improved, because this patch is doing
>> more than adding a "test", it is implementing the functionality to
>> create a CLOCK_MONOTONIC timer and to gettime() on it.
>>
>> > Closes #3888
>> https://devel.rtems.org/ticket/3888  ??
>>
>> >
>> > ---
>>
>> [...]
>>
>> > +
>> > + if ( rtems_timespec_less_than( &now, &expire ) ) {
>> > +  rtems_timespec_subtract( &now, &expire, &result );
>> > +} else {
>> > +  result.tv_nsec = 0;
>> > +  result.tv_sec  = 0;
>> > +}
>> The indentation level is wrong in this block.
>>
>> > +
>> > +  value->it_value = result;
>> > +  value->it_interval = ptimer->timer_data.it_interval;
>> > +
>> > +  _POSIX_Timer_Release( cpu, &lock_context );
>> > +  return 0;
>> > +}
>> > \ No newline at end of file
>> > 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" );
>> >
>>
>> Please provide updated psxtimer02.scn and report the results for
>> running rtems-test for at least the sparc/erc32 with sis including the
>> sptests and psxtests. If you need help how to run rtems-test, consult
>> the documentation and ask questions.
>> https://docs.rtems.org/branches/master/user/testing/index.html
>>
>> >TEST_END();
>> >rtems_test_exit (0);
>> > --
>> > 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


Re: [PATCH v3] Test needed for timer_create with CLOCK_MONOTONIC

2021-08-06 Thread zack leung
How do i report the findings of the  psx and  tests?


Thanks
Zack

On Thu, 5 Aug 2021 at 19:23, Gedare Bloom  wrote:

> On Thu, Aug 5, 2021 at 12:36 PM Zacchaeus Leung
>  wrote:
> >
> > the timer_create() method can use CLOCK_MONOTONIC but there was  no test
> for this
> >
> The commit message needs to be improved, because this patch is doing
> more than adding a "test", it is implementing the functionality to
> create a CLOCK_MONOTONIC timer and to gettime() on it.
>
> > Closes #3888
> https://devel.rtems.org/ticket/3888  ??
>
> >
> > ---
>
> [...]
>
> > +
> > + if ( rtems_timespec_less_than( &now, &expire ) ) {
> > +  rtems_timespec_subtract( &now, &expire, &result );
> > +} else {
> > +  result.tv_nsec = 0;
> > +  result.tv_sec  = 0;
> > +}
> The indentation level is wrong in this block.
>
> > +
> > +  value->it_value = result;
> > +  value->it_interval = ptimer->timer_data.it_interval;
> > +
> > +  _POSIX_Timer_Release( cpu, &lock_context );
> > +  return 0;
> > +}
> > \ No newline at end of file
> > 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" );
> >
>
> Please provide updated psxtimer02.scn and report the results for
> running rtems-test for at least the sparc/erc32 with sis including the
> sptests and psxtests. If you need help how to run rtems-test, consult
> the documentation and ask questions.
> https://docs.rtems.org/branches/master/user/testing/index.html
>
> >TEST_END();
> >rtems_test_exit (0);
> > --
> > 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

Re: [PATCH v3] Test needed for timer_create with CLOCK_MONOTONIC

2021-08-05 Thread Gedare Bloom
On Thu, Aug 5, 2021 at 12:36 PM Zacchaeus Leung
 wrote:
>
> the timer_create() method can use CLOCK_MONOTONIC but there was  no test for 
> this
>
The commit message needs to be improved, because this patch is doing
more than adding a "test", it is implementing the functionality to
create a CLOCK_MONOTONIC timer and to gettime() on it.

> Closes #3888
https://devel.rtems.org/ticket/3888  ??

>
> ---

[...]

> +
> + if ( rtems_timespec_less_than( &now, &expire ) ) {
> +  rtems_timespec_subtract( &now, &expire, &result );
> +} else {
> +  result.tv_nsec = 0;
> +  result.tv_sec  = 0;
> +}
The indentation level is wrong in this block.

> +
> +  value->it_value = result;
> +  value->it_interval = ptimer->timer_data.it_interval;
> +
> +  _POSIX_Timer_Release( cpu, &lock_context );
> +  return 0;
> +}
> \ No newline at end of file
> 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" );
>

Please provide updated psxtimer02.scn and report the results for
running rtems-test for at least the sparc/erc32 with sis including the
sptests and psxtests. If you need help how to run rtems-test, consult
the documentation and ask questions.
https://docs.rtems.org/branches/master/user/testing/index.html

>TEST_END();
>rtems_test_exit (0);
> --
> 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


[PATCH v3] Test needed for timer_create with CLOCK_MONOTONIC

2021-08-05 Thread Zacchaeus Leung
the timer_create() method can use CLOCK_MONOTONIC but there was  no test for 
this

Closes #3888

---
 cpukit/include/rtems/posix/timer.h|  1 +
 cpukit/posix/src/psxtimercreate.c |  3 +-
 cpukit/posix/src/timergettime.c   | 54 ++-
 testsuites/psxtests/psxtimer02/psxtimer.c | 26 +++
 4 files changed, 62 insertions(+), 22 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..3920325e52 100644
--- a/cpukit/posix/src/timergettime.c
+++ b/cpukit/posix/src/timergettime.c
@@ -28,6 +28,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /*
  *  - When a timer is initialized, the value of the time in
@@ -39,35 +40,46 @@
 int timer_gettime(
   timer_ttimerid,
   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;
-
-cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
-now = cpu->Watchdog.ticks;
-
-if ( now < ptimer->Timer.expire ) {
-  remaining = (uint32_t) ( ptimer->Timer.expire - now );
-} else {
-  remaining = 0;
-}
+  if ( ptimer == NULL ) {
+rtems_set_errno_and_return_minus_one( EINVAL );
+  }
 
-_Timespec_From_ticks( remaining, &value->it_value );
-value->it_interval = ptimer->timer_data.it_interval;
+  cpu = _POSIX_Timer_Acquire_critical( ptimer, &lock_context );
+  rtems_timespec_from_ticks( ptimer->Timer.expire, &expire );
 
-_POSIX_Timer_Release( cpu, &lock_context );
-return 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 );
   }
 
-  rtems_set_errno_and_return_minus_one( EINVAL );
-}
+
+ if ( rtems_timespec_less_than( &now, &expire ) ) {
+  rtems_timespec_subtract( &now, &expire, &result );
+} else {
+  result.tv_nsec = 0;
+  result.tv_sec  = 0;
+}
+  
+  value->it_value = result;
+  value->it_interval = ptimer->timer_data.it_interval;
+  
+  _POSIX_Timer_Release( cpu, &lock_context );
+  return 0;
+}
\ No newline at end of file
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 );