fix #3910
[ghc-hetmet.git] / rts / Hpc.c
index 014319c..81c802c 100644 (file)
--- a/rts/Hpc.c
+++ b/rts/Hpc.c
@@ -2,15 +2,23 @@
  * (c)2006 Galois Connections, Inc.
  */ 
 
+#include "PosixSource.h"
+#include "Rts.h"
+
+#include "Trace.h"
+
 #include <stdio.h>
 #include <ctype.h>
-#include <stdlib.h>
 #include <string.h>
 #include <assert.h>
 
-#include "Rts.h"
-#include "Hpc.h"
-#include "Trace.h"
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#ifdef HAVE_SYS_STAT_H
+#include <sys/stat.h>
+#endif
 
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
@@ -28,20 +36,14 @@ static pid_t hpc_pid = 0;           // pid of this process at hpc-boot time.
 static FILE *tixFile;                  // file being read/written
 static int tix_ch;                     // current char
 
-// This is a cruel hack, we should completely redesign the format specifier handling in the RTS.
-#if SIZEOF_LONG == 8
-#define PRIuWORD64 "lu"
-#else
-#define PRIuWORD64 "llu"
-#endif
-
 HpcModuleInfo *modules = 0;
 HpcModuleInfo *nextModule = 0;
 int totalTixes = 0;            // total number of tix boxes.
 
 static char *tixFilename;
 
-static void failure(char *msg) {
+static void GNU_ATTRIBUTE(__noreturn__)
+failure(char *msg) {
   debugTrace(DEBUG_hpc,"hpc failure: %s\n",msg);
   fprintf(stderr,"Hpc failure: %s\n",msg);
   if (tixFilename) {
@@ -49,7 +51,7 @@ static void failure(char *msg) {
   } else {
     fprintf(stderr,"(perhaps remove .tix file?)\n");
   }
-  exit(-1);
+  stg_exit(1);
 }
 
 static int init_open(FILE *file) {
@@ -165,14 +167,37 @@ readTix(void) {
 }
 
 static void hpc_init(void) {
+  char *hpc_tixdir;
+  char *hpc_tixfile;
   if (hpc_inited != 0) {
     return;
   }
   hpc_inited = 1;
   hpc_pid    = getpid();
-
-  tixFilename = (char *) malloc(strlen(prog_name) + 6);
-  sprintf(tixFilename, "%s.tix", prog_name);
+  hpc_tixdir = getenv("HPCTIXDIR");
+  hpc_tixfile = getenv("HPCTIXFILE");
+
+  /* XXX Check results of mallocs/strdups, and check we are requesting
+         enough bytes */
+  if (hpc_tixfile != NULL) {
+    tixFilename = strdup(hpc_tixfile);
+  } else if (hpc_tixdir != NULL) {
+    /* Make sure the directory is present;
+     * conditional code for mkdir lifted from lndir.c
+     */
+#ifdef WIN32
+    mkdir(hpc_tixdir);
+#else
+    mkdir(hpc_tixdir,0777);
+#endif
+    /* Then, try open the file
+     */
+    tixFilename = (char *) malloc(strlen(hpc_tixdir) + strlen(prog_name) + 12);
+    sprintf(tixFilename,"%s/%s-%d.tix",hpc_tixdir,prog_name,(int)hpc_pid);
+  } else {
+    tixFilename = (char *) malloc(strlen(prog_name) + 6);
+    sprintf(tixFilename, "%s.tix", prog_name);
+  }
 
   if (init_open(fopen(tixFilename,"r"))) {
     readTix();
@@ -210,7 +235,7 @@ hs_hpc_module(char *modName,
        fprintf(stderr,"in module '%s'\n",tmpModule->modName);
        failure("module mismatch with .tix/.mix file hash number");
        fprintf(stderr,"(perhaps remove %s ?)\n",tixFilename);
-       exit(-1);
+       stg_exit(1);
 
       }
       for(i=0;i < modCount;i++) {
@@ -301,7 +326,7 @@ writeTix(FILE *f) {
       }
 
       if (tmpModule->tixArr) {
-       fprintf(f,"%" PRIuWORD64,tmpModule->tixArr[i]);
+       fprintf(f,"%" FMT_Word64,tmpModule->tixArr[i]);
       } else {
        fprintf(f,"0");
       }