[project @ 2002-11-01 11:17:29 by simonmar]
[ghc-hetmet.git] / ghc / rts / RtsUtils.c
index 2b929c9..69a1450 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: RtsUtils.c,v 1.14 2000/03/31 03:09:36 hwloidl Exp $
+ * $Id: RtsUtils.c,v 1.28 2002/10/05 22:31:04 panne Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -7,6 +7,9 @@
  *
  * ---------------------------------------------------------------------------*/
 
+/* gettimeofday isn't POSIX */
+/* #include "PosixSource.h" */
+
 #include "Rts.h"
 #include "RtsTypes.h"
 #include "RtsAPI.h"
@@ -28,6 +31,8 @@
 #include <sys/time.h>
 #endif
 
+#include <stdlib.h>
+#include <string.h>
 #include <stdarg.h>
 
 /* variable-argument error function. */
@@ -46,6 +51,7 @@ void barf(char *s, ...)
   fprintf(stderr, "\n");
   fflush(stderr);
   stg_exit(EXIT_INTERNAL_ERROR);
+  va_end(ap);
 }
 
 void prog_belch(char *s, ...)
@@ -58,6 +64,7 @@ void prog_belch(char *s, ...)
   } 
   vfprintf(stderr, s, ap);
   fprintf(stderr, "\n");
+  va_end(ap);
 }
 
 void belch(char *s, ...)
@@ -67,6 +74,7 @@ void belch(char *s, ...)
   /* don't fflush(stdout); WORKAROUND bug in Linux glibc */
   vfprintf(stderr, s, ap);
   fprintf(stderr, "\n");
+  va_end(ap);
 }
 
 /* result-checking malloc wrappers. */
@@ -109,11 +117,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();
 }
 
@@ -169,7 +188,7 @@ nat stg_strlen(char *s)
    ToDo: put this somewhere sensible.
    -------------------------------------------------------------------------  */
 
-I_ __GenSymCounter = 0;
+static I_ __GenSymCounter = 0;
 
 I_
 genSymZh(void)
@@ -210,27 +229,41 @@ time_str(void)
  * clean up for us.
  * -------------------------------------------------------------------------- */
 
+#if !defined(mingw32_TARGET_OS)
 void
 resetNonBlockingFd(int fd)
 {
   long fd_flags;
 
-#if !defined(_WIN32) || defined(__CYGWIN__) || defined(__CYGWIN32__)
   /* clear the non-blocking flag on this file descriptor */
   fd_flags = fcntl(fd, F_GETFL);
   if (fd_flags & O_NONBLOCK) {
     fcntl(fd, F_SETFL, fd_flags & ~O_NONBLOCK);
   }
-#endif
 }
 
+void
+setNonBlockingFd(int fd)
+{
+  long fd_flags;
+
+  /* clear the non-blocking flag on this file descriptor */
+  fd_flags = fcntl(fd, F_GETFL);
+  fcntl(fd, F_SETFL, fd_flags | O_NONBLOCK);
+}
+#else
+/* Don't support non-blocking FDs (yet) on mingw */
+void resetNonBlockingFd(int fd STG_UNUSED) {}
+void setNonBlockingFd(int fd STG_UNUSED) {}
+#endif
+
 static ullong startTime = 0;
 
 /* used in a parallel setup */
 ullong
 msTime(void)
 {
-# if defined(HAVE_GETCLOCK) && !defined(alpha_TARGET_ARCH)
+# if defined(HAVE_GETCLOCK) && !defined(alpha_TARGET_ARCH) && !defined(hppa1_1_TARGET_ARCH)
     struct timespec tv;
 
     if (getclock(TIMEOFDAY, &tv) != 0) {
@@ -267,21 +300,21 @@ char *
 ullong_format_string(ullong x, char *s, rtsBool with_commas)
 {
     if (x < (ullong)1000) 
-       sprintf(s, "%d", (nat)x);
+       sprintf(s, "%lu", (lnat)x);
     else if (x < (ullong)1000000)
-       sprintf(s, (with_commas) ? "%ld,%3.3ld" : "%ld%3.3ld",
-               (nat)((x)/(ullong)1000),
-               (nat)((x)%(ullong)1000));
+       sprintf(s, (with_commas) ? "%lu,%3.3lu" : "%lu%3.3lu",
+               (lnat)((x)/(ullong)1000),
+               (lnat)((x)%(ullong)1000));
     else if (x < (ullong)1000000000)
-       sprintf(s, (with_commas) ? "%ld,%3.3ld,%3.3ld" :  "%ld%3.3ld%3.3ld",
-               (nat)((x)/(ullong)1000000),
-               (nat)((x)/(ullong)1000%(ullong)1000),
-               (nat)((x)%(ullong)1000));
+       sprintf(s, (with_commas) ? "%lu,%3.3lu,%3.3lu" :  "%lu%3.3lu%3.3lu",
+               (lnat)((x)/(ullong)1000000),
+               (lnat)((x)/(ullong)1000%(ullong)1000),
+               (lnat)((x)%(ullong)1000));
     else
-       sprintf(s, (with_commas) ? "%ld,%3.3ld,%3.3ld,%3.3ld" : "%ld%3.3ld%3.3ld%3.3ld",
-               (nat)((x)/(ullong)1000000000),
-               (nat)((x)/(ullong)1000000%(ullong)1000),
-               (nat)((x)/(ullong)1000%(ullong)1000), 
-               (nat)((x)%(ullong)1000));
+       sprintf(s, (with_commas) ? "%lu,%3.3lu,%3.3lu,%3.3lu" : "%lu%3.3lu%3.3lu%3.3lu",
+               (lnat)((x)/(ullong)1000000000),
+               (lnat)((x)/(ullong)1000000%(ullong)1000),
+               (lnat)((x)/(ullong)1000%(ullong)1000), 
+               (lnat)((x)%(ullong)1000));
     return s;
 }