[project @ 2000-01-17 12:30:07 by simonmar]
[ghc-hetmet.git] / ghc / lib / std / cbits / getClockTime.c
index 9b96e33..0aa8e06 100644 (file)
@@ -1,7 +1,7 @@
 /* 
  * (c) The GRASP/AQUA Project, Glasgow University, 1994-1998
  *
- * $Id: getClockTime.c,v 1.4 1999/05/03 13:22:29 sof Exp $
+ * $Id: getClockTime.c,v 1.8 1999/10/26 09:34:09 sof Exp $
  *
  * getClockTime Runtime Support
  */
 #include "Rts.h"
 #include "stgio.h"
 
-#ifdef HAVE_GETCLOCK
-
-# ifdef HAVE_SYS_TIMERS_H
-#  define POSIX_4D9 1
-#  include <sys/timers.h>
-# endif
-
-#else
-# ifdef HAVE_GETTIMEOFDAY
+/* Note: skewing this code in favour of non-POSIX calls
+   such as gettimeofday() and getclock() rather than time(),
+   may seem strange/wrong. There's a good reason for it
+   though - the non-POSIX calls gives you better precision --
+   they return usecs (or nsecs) as well as seconds, which
+   the users of getClockTime() is interested in knowing.
+ */
 
+#if defined(HAVE_GETTIMEOFDAY)
 #  ifdef HAVE_SYS_TIME_H
 #   include <sys/time.h>
 #  endif
-
-# else
-
-#  ifdef HAVE_TIME_H
-#   include <time.h>
-#  endif
-
+#elif defined(HAVE_GETCLOCK)
+# ifdef HAVE_SYS_TIMERS_H
+#  define POSIX_4D9 1
+#  include <sys/timers.h>
 # endif
+#elif defined(HAVE_TIME_H)
+# include <time.h>
 #endif
 
 #ifdef HAVE_WINDOWS_H
 StgInt
 getClockTime(StgByteArray sec, StgByteArray nsec)
 {
-#if defined(_WIN32)
+#if defined(_WIN32) && !defined(cygwin32_TARGET_OS)
+  /*
+   * ftime() as implemented by cygwin (in B20.1) is
+   * not right, so stay away & use time() there instead.
+   */
   struct timeb t;
 
   _ftime(&t);
@@ -53,17 +55,6 @@ getClockTime(StgByteArray sec, StgByteArray nsec)
   ((unsigned int *)sec)[0] = (unsigned int)t.time;
   ((unsigned int *)nsec)[0] = (unsigned int)t.millitm * 1000;
   return 0;
-#elif defined(HAVE_GETCLOCK)
-    struct timespec tp;
-
-    if (getclock(TIMEOFDAY, &tp) != 0) {
-       cvtErrno();
-       stdErrno();
-       return -1;
-    }
-    ((unsigned long int *)sec)[0] = tp.tv_sec;
-    ((unsigned long int *)nsec)[0] = tp.tv_nsec;
-    return 0;
 #elif defined(HAVE_GETTIMEOFDAY)
     struct timeval tp;
  
@@ -75,30 +66,6 @@ getClockTime(StgByteArray sec, StgByteArray nsec)
     ((unsigned long int *)sec)[0] = tp.tv_sec;
     ((unsigned long int *)nsec)[0] = tp.tv_usec * 1000;
     return 0;
-#else
-    time_t t;
-    if ((t = time(NULL)) == (time_t) -1) {
-       cvtErrno();
-       stdErrno();
-       return -1;
-    }
-    ((unsigned long int *)sec)[0] = t;
-    ((unsigned long int *)nsec)[0] = 0;
-    return 0;
-#endif
-}
-
-StgInt
-prim_getClockTime(StgByteArray sec, StgByteArray nsec)
-{
-#if defined(_WIN32)
-  struct timeb t;
-
-  _ftime(&t);
-
-  ((unsigned long int *)sec)[0] = t.time;
-  ((unsigned long int *)nsec)[0] = t.millitm * 1000;
-  return 0;
 #elif defined(HAVE_GETCLOCK)
     struct timespec tp;
 
@@ -107,29 +74,20 @@ prim_getClockTime(StgByteArray sec, StgByteArray nsec)
        stdErrno();
        return -1;
     }
-    ((StgInt64*)sec)[0] = tp.tv_sec;
-    ((StgInt64*)nsec)[0] = tp.tv_nsec;
-    return 0;
-#elif defined(HAVE_GETTIMEOFDAY)
-    struct timeval tp;
-    if (gettimeofday(&tp, NULL) != 0) {
-       cvtErrno();
-       stdErrno();
-       return -1;
-    }
-    ((StgInt64*)sec)[0] = tp.tv_sec;
-    ((StgInt64*)nsec)[0] = tp.tv_usec * 1000;
+    ((unsigned long int *)sec)[0] = tp.tv_sec;
+    ((unsigned long int *)nsec)[0] = tp.tv_nsec;
     return 0;
-#else
+#elif defined(HAVE_TIME_H)
     time_t t;
     if ((t = time(NULL)) == (time_t) -1) {
        cvtErrno();
        stdErrno();
        return -1;
     }
-    ((StgInt64*)sec)[0] = t;
-    ((StgInt64*)nsec)[0] = 0;
+    ((unsigned long int *)sec)[0] = t;
+    ((unsigned long int *)nsec)[0] = 0;
     return 0;
+#else
+#error "getClockTime: don't know how to get at the clock's time"
 #endif
 }