[project @ 2000-04-14 14:07:43 by simonmar]
[ghc-hetmet.git] / ghc / rts / RtsUtils.c
index 24ef889..23bf0d6 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsUtils.c,v 1.11 2000/01/12 15:15:17 simonmar Exp $
+ * $Id: RtsUtils.c,v 1.15 2000/04/14 14:07:43 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -7,7 +7,11 @@
  *
  * ---------------------------------------------------------------------------*/
 
+/* gettimeofday isn't POSIX */
+#define NON_POSIX_SOURCE
+
 #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. */
@@ -40,7 +48,7 @@ void barf(char *s, ...)
   vfprintf(stderr, s, ap);
   fprintf(stderr, "\n");
   fflush(stderr);
-  stg_exit(EXIT_FAILURE);
+  stg_exit(EXIT_INTERNAL_ERROR);
 }
 
 void prog_belch(char *s, ...)
@@ -73,8 +81,8 @@ stgMallocBytes (int n, char *msg)
 
     if ((space = (char *) malloc((size_t) n)) == NULL) {
       /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
-       MallocFailHook((W_) n, msg); /*msg*/
-       stg_exit(EXIT_FAILURE);
+      MallocFailHook((W_) n, msg); /*msg*/
+      stg_exit(EXIT_INTERNAL_ERROR);
     }
     return space;
 }
@@ -86,8 +94,8 @@ stgReallocBytes (void *p, int n, char *msg)
 
     if ((space = (char *) realloc(p, (size_t) n)) == NULL) {
       /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
-       MallocFailHook((W_) n, msg); /*msg*/
-       exit(EXIT_FAILURE);
+      MallocFailHook((W_) n, msg); /*msg*/
+      stg_exit(EXIT_INTERNAL_ERROR);
     }
     return space;
 }
@@ -139,7 +147,7 @@ heapOverflow(void)
   if (RtsFlags.TickyFlags.showTickyStats) PrintTickyInfo();
 #endif
 
-  stg_exit(EXIT_FAILURE);
+  stg_exit(EXIT_HEAPOVERFLOW);
 }
 
 /* -----------------------------------------------------------------------------
@@ -182,7 +190,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)
 {
@@ -219,6 +227,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)
+    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.
    -------------------------------------------------------------------------- */