]> granicus.if.org Git - check/commitdiff
If CLOCK_MONOTONIC is not supported, try CLOCK_REALTIME
authorbrarcher <brarcher@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Sat, 21 Sep 2013 17:10:32 +0000 (17:10 +0000)
committerbrarcher <brarcher@64e312b2-a51f-0410-8e61-82d0ca0eb02a>
Sat, 21 Sep 2013 17:10:32 +0000 (17:10 +0000)
The cygwin platform (perhaps others) does not support the
CLOCK_MONOTONIC timer. Attempt to use the realtime clock,
and bail out if that also fails.

Fix for bug #88

git-svn-id: svn+ssh://svn.code.sf.net/p/check/code/trunk@760 64e312b2-a51f-0410-8e61-82d0ca0eb02a

lib/libcompat.h
src/check_run.c

index d2c713f9fb23ceffda5682ef7eb4bf76d79a7ad9..4d479cbc8113902f5ed473976c8bb2fe4a340a8a 100644 (file)
@@ -109,14 +109,18 @@ int unsetenv (const char *name);
 #ifndef HAVE_LIBRT
 /* 
  * On systems where clock_gettime() is not available, the
- * definition for CLOCK_MONOTONIC will also not be available.
- * This variable should define which type of clock clock_gettime()
- * should use. We define it here if it is not defined simply
- * so the reimplementation can ignore it.
+ * definition for CLOCK_MONOTONIC and CLOCK_REALTIME will
+ * also not be available. This variable should define which
+ * type of clock clock_gettime() should use. We define it
+ * here if it is not defined simply so the reimplementation
+ * can ignore it.
  */
 #ifndef CLOCK_MONOTONIC
 #define CLOCK_MONOTONIC 0
 #endif
+#ifndef CLOCK_REALTIME
+#define CLOCK_REALTIME 0
+#endif
 
 #ifdef STRUCT_ITIMERSPEC_DEFINITION_MISSING
 /* 
index def7344f5141d060e393d616cb1f16c80352a1c7..b9b47784802194876582b98cb2e500862e6a578d 100644 (file)
@@ -379,6 +379,7 @@ static TestResult *tcase_run_tfun_fork (SRunner *sr, TCase *tc, TF *tfun, int i)
   int status = 0;
   struct timespec ts_start, ts_end;
 
+  int timer_create_result;
   timer_t timerid;
   struct itimerspec timer_spec; 
   TestResult * tr;
@@ -403,10 +404,24 @@ static TestResult *tcase_run_tfun_fork (SRunner *sr, TCase *tc, TF *tfun, int i)
   }
 
   alarm_received = 0;
-  
-  if(timer_create(CLOCK_MONOTONIC, 
-               NULL /* fire SIGALRM if timer expires */,
-               &timerid) == 0)
+
+  timer_create_result = timer_create(CLOCK_MONOTONIC,
+                           NULL /* fire SIGALRM if timer expires */,
+                           &timerid);
+
+  /*
+   * CLOCK_MONOTONIC is not supported on the Cygwin platform
+   * (maybe others as well). If the timer creation fails, attempt with
+   * CLOCK_REALTIME before bailing out.
+   */
+  if(timer_create_result != 0)
+  {
+         timer_create_result = timer_create(CLOCK_REALTIME,
+                           NULL /* fire SIGALRM if timer expires */,
+                           &timerid);
+  }
+
+  if(timer_create_result == 0)
   {
     /* Set the timer to fire once */
     timer_spec.it_value            = tc->timeout;