RTS tidyup sweep, first phase
[ghc-hetmet.git] / rts / Hpc.c
index 014319c..cf75a05 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>
@@ -41,7 +49,8 @@ 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) {
@@ -165,14 +174,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,hpc_pid);
+  } else {
+    tixFilename = (char *) malloc(strlen(prog_name) + 6);
+    sprintf(tixFilename, "%s.tix", prog_name);
+  }
 
   if (init_open(fopen(tixFilename,"r"))) {
     readTix();