This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 4/6] nptl/tst-rwlock: Use clock_gettime/timespec rather than gettimeofday/timeval



On 29/03/2019 01:31, Mike Crowe wrote:
> In preparation for adding pthread_rwlock_clockrdlock and
> pthread_rwlock_clockwrlock, convert various tests to only use clock_gettime
> and struct timespec.
> 
> 	* nptl/tst-rwlock6.c: Fix small bug in timeout-checking code that
> 	could erroneously pass if the function incorrectly took more than a
> 	second.
> 
> 	* nptl/tst-rwlock6.c: Use clock_gettime(2) rather than
> 	gettimeofday(2) and then converting to timespec in preparation for
> 	testing pthread_rwlock_clockrdclock and pthread_rwlock_clockwrlock.
> 
> 	* nptl/tst-rwlock7.c, nptl/tst-rwlock9.c: Likewise.
> ---
>  ChangeLog          | 12 ++++++++++++-
>  nptl/tst-rwlock6.c | 47 ++++++++++++++++++-----------------------------
>  nptl/tst-rwlock7.c | 43 +++++++++++++++++--------------------------
>  nptl/tst-rwlock9.c |  8 ++------
>  4 files changed, 49 insertions(+), 61 deletions(-)
> 
> diff --git a/ChangeLog b/ChangeLog
> index 436736d..5507086 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,5 +1,17 @@
>  2019-03-28  Mike Crowe  <mac@mcrowe.com>
>  
> +	* nptl/tst-rwlock6.c: Fix small bug in timeout-checking code that
> +	could erroneously pass if the function incorrectly took more than a
> +	second.
> +
> +	* nptl/tst-rwlock6.c: Use clock_gettime(2) rather than
> +	gettimeofday(2) and then converting to timespec in preparation for
> +	testing pthread_rwlock_clockrdclock and pthread_rwlock_clockwrlock.
> +
> +	* nptl/tst-rwlock7.c, nptl/tst-rwlock9.c: Likewise.
> +
> +2019-03-28  Mike Crowe  <mac@mcrowe.com>
> +
>  	* nptl/tst-sem5.c(do_test): Use xclock_gettime and
>  	TEST_TIMESPEC_NOW_OR_AFTER from libsupport.
>  
> diff --git a/nptl/tst-rwlock6.c b/nptl/tst-rwlock6.c
> index 8d6c3dc..e57f045 100644
> --- a/nptl/tst-rwlock6.c
> +++ b/nptl/tst-rwlock6.c
> @@ -22,6 +22,7 @@
>  #include <stdio.h>
>  #include <string.h>
>  #include <sys/time.h>
> +#include <support/timespec.h>
>  
>  
>  static int kind[] =
> @@ -38,21 +39,15 @@ tf (void *arg)
>    pthread_rwlock_t *r = arg;
>  
>    /* Timeout: 0.3 secs.  */
> -  struct timeval tv;
> -  (void) gettimeofday (&tv, NULL);
> +  struct timespec ts_start;
> +  (void) clock_gettime(CLOCK_REALTIME, &ts_start);

Space after clock_gettime.

>  
> -  struct timespec ts;
> -  TIMEVAL_TO_TIMESPEC (&tv, &ts);
> -  ts.tv_nsec += 300000000;
> -  if (ts.tv_nsec >= 1000000000)
> -    {
> -      ts.tv_nsec -= 1000000000;
> -      ++ts.tv_sec;
> -    }
> +  struct timespec ts_timeout = {0, 300000000};
> +  timespec_add(&ts_timeout, &ts_start, &ts_timeout);

Space after timespec_add.

>  
>    puts ("child calling timedrdlock");
>  
> -  int err = pthread_rwlock_timedrdlock (r, &ts);
> +  int err = pthread_rwlock_timedrdlock (r, &ts_timeout);
>    if (err == 0)
>      {
>        puts ("rwlock_timedrdlock returned");
> @@ -68,24 +63,24 @@ tf (void *arg)
>  
>    puts ("1st child timedrdlock done");
>  
> -  struct timeval tv2;
> -  (void) gettimeofday (&tv2, NULL);
> +  struct timespec ts_end;
> +  (void) clock_gettime (CLOCK_REALTIME, &ts_end);

xclock_gettime maybe?

>  
> -  timersub (&tv2, &tv, &tv);
> +  struct timespec ts_duration;
> +  timespec_sub (&ts_duration, &ts_end, &ts_start);
>  
> -  if (tv.tv_usec < 200000)
> +  if (ts_duration.tv_sec !=0 || ts_duration.tv_nsec < 200000000)
>      {
>        puts ("timeout too short");
>        pthread_exit ((void *) 1l);
>      }
>  
> -  (void) gettimeofday (&tv, NULL);
> -  TIMEVAL_TO_TIMESPEC (&tv, &ts);
> -  ts.tv_sec += 10;
> +  (void) clock_gettime (CLOCK_REALTIME, &ts_timeout);
> +  ts_timeout.tv_sec += 10;

xclock_gettime maybe?

>    /* Note that the following operation makes ts invalid.  */
> -  ts.tv_nsec += 1000000000;
> +  ts_timeout.tv_nsec += 1000000000;
>  
> -  err = pthread_rwlock_timedrdlock (r, &ts);
> +  err = pthread_rwlock_timedrdlock (r, &ts_timeout);
>    if (err == 0)
>      {
>        puts ("2nd timedrdlock succeeded");
> @@ -136,12 +131,8 @@ do_test (void)
>  	  exit (1);
>  	}
>  
> -      struct timeval tv;
> -      (void) gettimeofday (&tv, NULL);
> -
>        struct timespec ts;
> -      TIMEVAL_TO_TIMESPEC (&tv, &ts);
> -
> +      (void) clock_gettime (CLOCK_REALTIME, &ts);

Ditto.

>        ++ts.tv_sec;
>  
>        /* Get a write lock.  */
> @@ -154,8 +145,7 @@ do_test (void)
>  
>        puts ("1st timedwrlock done");
>  
> -      (void) gettimeofday (&tv, NULL);
> -      TIMEVAL_TO_TIMESPEC (&tv, &ts);
> +      (void) clock_gettime (CLOCK_REALTIME, &ts);

Ditto.

>        ++ts.tv_sec;
>        e = pthread_rwlock_timedrdlock (&r, &ts);
>        if (e == 0)
> @@ -171,8 +161,7 @@ do_test (void)
>  
>        puts ("1st timedrdlock done");
>  
> -      (void) gettimeofday (&tv, NULL);
> -      TIMEVAL_TO_TIMESPEC (&tv, &ts);
> +      (void) clock_gettime (CLOCK_REALTIME, &ts);

Ditto.

>        ++ts.tv_sec;
>        e = pthread_rwlock_timedwrlock (&r, &ts);
>        if (e == 0)
> diff --git a/nptl/tst-rwlock7.c b/nptl/tst-rwlock7.c
> index 4d6f561..1c64969 100644
> --- a/nptl/tst-rwlock7.c
> +++ b/nptl/tst-rwlock7.c
> @@ -22,6 +22,7 @@
>  #include <stdio.h>
>  #include <string.h>
>  #include <sys/time.h>
> +#include <support/timespec.h>
>  
>  
>  static int kind[] =
> @@ -38,19 +39,12 @@ tf (void *arg)
>    pthread_rwlock_t *r = arg;
>  
>    /* Timeout: 0.3 secs.  */
> -  struct timeval tv;
> -  (void) gettimeofday (&tv, NULL);
> +  struct timespec ts_start;
> +  (void) clock_gettime (CLOCK_REALTIME, &ts_start);

xclock_gettime maybe?

> +  struct timespec ts_timeout = {0, 300000000};
> +  timespec_add(&ts_timeout, &ts_start, &ts_timeout);

Space after timespec_add.

>  
> -  struct timespec ts;
> -  TIMEVAL_TO_TIMESPEC (&tv, &ts);
> -  ts.tv_nsec += 300000000;
> -  if (ts.tv_nsec >= 1000000000)
> -    {
> -      ts.tv_nsec -= 1000000000;
> -      ++ts.tv_sec;
> -    }
> -
> -  int err = pthread_rwlock_timedwrlock (r, &ts);
> +  int err = pthread_rwlock_timedwrlock (r, &ts_timeout);
>    if (err == 0)
>      {
>        puts ("rwlock_timedwrlock returned");
> @@ -65,24 +59,24 @@ tf (void *arg)
>      }
>    puts ("child: timedwrlock failed with ETIMEDOUT");
>  
> -  struct timeval tv2;
> -  (void) gettimeofday (&tv2, NULL);
> -
> -  timersub (&tv2, &tv, &tv);
> +  struct timespec ts_end;
> +  (void) clock_gettime (CLOCK_REALTIME, &ts_end);

Ditto.

> +  struct timespec ts_diff;
> +  timespec_sub (&ts_diff, &ts_end, &ts_start);
>  
> -  if (tv.tv_usec < 200000)
> +  if (ts_diff.tv_sec != 0 || ts_diff.tv_nsec < 200000000)
>      {
>        puts ("timeout too short");
>        pthread_exit ((void *) 1l);
>      }
>  
> -  (void) gettimeofday (&tv, NULL);
> -  TIMEVAL_TO_TIMESPEC (&tv, &ts);
> -  ts.tv_sec += 10;
> +  struct timespec ts_invalid;
> +  (void) clock_gettime (CLOCK_REALTIME, &ts_invalid);

Ditto.

> +  ts_invalid.tv_sec += 10;
>    /* Note that the following operation makes ts invalid.  */
> -  ts.tv_nsec += 1000000000;
> +  ts_invalid.tv_nsec += 1000000000;
>  
> -  err = pthread_rwlock_timedwrlock (r, &ts);
> +  err = pthread_rwlock_timedwrlock (r, &ts_invalid);
>    if (err == 0)
>      {
>        puts ("2nd timedwrlock succeeded");
> @@ -132,11 +126,8 @@ do_test (void)
>  	  exit (1);
>  	}
>  
> -      struct timeval tv;
> -      (void) gettimeofday (&tv, NULL);
> -
>        struct timespec ts;
> -      TIMEVAL_TO_TIMESPEC (&tv, &ts);
> +      (void) clock_gettime (CLOCK_REALTIME, &ts);
>  

Ditto.

>        ++ts.tv_sec;
>  
> diff --git a/nptl/tst-rwlock9.c b/nptl/tst-rwlock9.c
> index 34f2d04..ff15f90 100644
> --- a/nptl/tst-rwlock9.c
> +++ b/nptl/tst-rwlock9.c
> @@ -56,9 +56,7 @@ writer_thread (void *nr)
>        int e;
>        do
>  	{
> -	  struct timeval tv;
> -	  (void) gettimeofday (&tv, NULL);
> -	  TIMEVAL_TO_TIMESPEC (&tv, &ts);
> +	  (void) clock_gettime (CLOCK_REALTIME, &ts);
>  

Ditto.

>  	  ts.tv_nsec += 2 * TIMEOUT;
>  	  if (ts.tv_nsec >= 1000000000)
> @@ -110,9 +108,7 @@ reader_thread (void *nr)
>        int e;
>        do
>  	{
> -	  struct timeval tv;
> -	  (void) gettimeofday (&tv, NULL);
> -	  TIMEVAL_TO_TIMESPEC (&tv, &ts);
> +	  (void) clock_gettime (CLOCK_REALTIME, &ts);
>  
>  	  ts.tv_nsec += TIMEOUT;
>  	  if (ts.tv_nsec >= 1000000000)
> 

Ditto.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]