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]

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


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);
 
-  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);
 
   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);
 
-  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;
   /* 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);
       ++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);
       ++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);
       ++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);
+  struct timespec ts_timeout = {0, 300000000};
+  timespec_add(&ts_timeout, &ts_start, &ts_timeout);
 
-  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);
+  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);
+  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);
 
       ++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);
 
 	  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)
-- 
git-series 0.9.1


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