[project @ 2001-09-04 18:29:20 by ken]
[ghc-hetmet.git] / ghc / rts / RtsUtils.c
index 28fb2f7..a8ce114 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsUtils.c,v 1.12 2000/01/13 12:40:16 simonmar Exp $
+ * $Id: RtsUtils.c,v 1.22 2001/08/29 15:02:02 sewardj Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -7,7 +7,11 @@
  *
  * ---------------------------------------------------------------------------*/
 
+/* gettimeofday isn't POSIX */
+/* #include "PosixSource.h" */
+
 #include "Rts.h"
+#include "RtsTypes.h"
 #include "RtsAPI.h"
 #include "RtsFlags.h"
 #include "Hooks.h"
 #include <fcntl.h>
 #endif
 
+#ifdef HAVE_GETTIMEOFDAY
+#include <sys/time.h>
+#endif
+
 #include <stdarg.h>
 
 /* variable-argument error function. */
@@ -104,11 +112,22 @@ stgReallocWords (void *p, int n, char *msg)
   return(stgReallocBytes(p, n * sizeof(W_), msg));
 }
 
+void *
+stgCallocBytes (int n, int m, char *msg)
+{
+  int   i;
+  int   sz = n * m;
+  char* p  = stgMallocBytes(sz, msg);
+  for (i = 0; i < sz; i++) p[i] = 0;
+  return p;
+}
+
 void 
-_stgAssert (char *filename, nat linenum)
+_stgAssert (char *filename, unsigned int linenum)
 {
-  /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
+  fflush(stdout);
   fprintf(stderr, "ASSERTION FAILED: file %s, line %u\n", filename, linenum);
+  fflush(stderr);
   abort();
 }
 
@@ -182,7 +201,7 @@ resetGenSymZh(void) /* it's your funeral */
    Get the current time as a string.  Used in profiling reports.
    -------------------------------------------------------------------------- */
 
-#if defined(PROFILING) || defined(DEBUG)
+#if defined(PROFILING) || defined(DEBUG) || defined(PAR) || defined(GRAN)
 char *
 time_str(void)
 {
@@ -210,7 +229,7 @@ resetNonBlockingFd(int fd)
 {
   long fd_flags;
 
-#if !defined(_WIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__)
+#if !defined(mingw32_TARGET_OS)
   /* clear the non-blocking flag on this file descriptor */
   fd_flags = fcntl(fd, F_GETFL);
   if (fd_flags & O_NONBLOCK) {
@@ -219,6 +238,41 @@ resetNonBlockingFd(int fd)
 #endif
 }
 
+static ullong startTime = 0;
+
+/* used in a parallel setup */
+ullong
+msTime(void)
+{
+# if defined(HAVE_GETCLOCK) && !defined(alpha_TARGET_ARCH) && !defined(hppa1_1_TARGET_ARCH)
+    struct timespec tv;
+
+    if (getclock(TIMEOFDAY, &tv) != 0) {
+       fflush(stdout);
+       fprintf(stderr, "Clock failed\n");
+       stg_exit(EXIT_FAILURE);
+    }
+    return tv.tv_sec * LL(1000) + tv.tv_nsec / LL(1000000) - startTime;
+# elif HAVE_GETTIMEOFDAY && !defined(alpha_TARGET_ARCH)
+    struct timeval tv;
+    if (gettimeofday(&tv, NULL) != 0) {
+       fflush(stdout);
+       fprintf(stderr, "Clock failed\n");
+       stg_exit(EXIT_FAILURE);
+    }
+    return tv.tv_sec * LL(1000) + tv.tv_usec / LL(1000) - startTime;
+# else
+    time_t t;
+    if ((t = time(NULL)) == (time_t) -1) {
+       fflush(stdout);
+       fprintf(stderr, "Clock failed\n");
+       stg_exit(EXIT_FAILURE);
+    }
+    return t * LL(1000) - startTime;
+# endif
+}
+
 /* -----------------------------------------------------------------------------
    Print large numbers, with punctuation.
    -------------------------------------------------------------------------- */