FIX #2234: don't generate <prog>.prof unless we're going to put something in it
authorSimon Marlow <marlowsd@gmail.com>
Mon, 12 May 2008 10:40:20 +0000 (10:40 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 12 May 2008 10:40:20 +0000 (10:40 +0000)
rts/Profiling.c
rts/RtsStartup.c

index 4e759b6..77fab52 100644 (file)
@@ -268,34 +268,44 @@ ccsSetSelected( CostCentreStack *ccs )
 static void
 initProfilingLogFile(void)
 {
-    /* Initialise the log file name */
-    prof_filename = arenaAlloc(prof_arena, strlen(prog_name) + 6);
-    sprintf(prof_filename, "%s.prof", prog_name);
-
-    /* open the log file */
-    if ((prof_file = fopen(prof_filename, "w")) == NULL) {
-       debugBelch("Can't open profiling report file %s\n", prof_filename);
-       RtsFlags.CcFlags.doCostCentres = 0;
-        // The following line was added by Sung; retainer/LDV profiling may need
-        // two output files, i.e., <program>.prof/hp.
-        if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_RETAINER)
-            RtsFlags.ProfFlags.doHeapProfile = 0;
-       return;
+    if (RtsFlags.CcFlags.doCostCentres == 0 && 
+        RtsFlags.ProfFlags.doHeapProfile != HEAP_BY_RETAINER)
+    {
+        /* No need for the <prog>.prof file */
+        prof_filename = NULL;
+        prof_file = NULL;
     }
-
-    if (RtsFlags.CcFlags.doCostCentres == COST_CENTRES_XML) {
-       /* dump the time, and the profiling interval */
-       fprintf(prof_file, "\"%s\"\n", time_str());
-       fprintf(prof_file, "\"%d ms\"\n", RtsFlags.MiscFlags.tickInterval);
-       
-       /* declare all the cost centres */
-       {
-           CostCentre *cc;
-           for (cc = CC_LIST; cc != NULL; cc = cc->link) {
-               fprintf(prof_file, "%d %ld \"%s\" \"%s\"\n",
-                       CC_UQ, cc->ccID, cc->label, cc->module);
-           }
-       }
+    else
+    {
+        /* Initialise the log file name */
+        prof_filename = arenaAlloc(prof_arena, strlen(prog_name) + 6);
+        sprintf(prof_filename, "%s.prof", prog_name);
+
+        /* open the log file */
+        if ((prof_file = fopen(prof_filename, "w")) == NULL) {
+            debugBelch("Can't open profiling report file %s\n", prof_filename);
+            RtsFlags.CcFlags.doCostCentres = 0;
+            // The following line was added by Sung; retainer/LDV profiling may need
+            // two output files, i.e., <program>.prof/hp.
+            if (RtsFlags.ProfFlags.doHeapProfile == HEAP_BY_RETAINER)
+                RtsFlags.ProfFlags.doHeapProfile = 0;
+            return;
+        }
+
+        if (RtsFlags.CcFlags.doCostCentres == COST_CENTRES_XML) {
+            /* dump the time, and the profiling interval */
+            fprintf(prof_file, "\"%s\"\n", time_str());
+            fprintf(prof_file, "\"%d ms\"\n", RtsFlags.MiscFlags.tickInterval);
+            
+            /* declare all the cost centres */
+            {
+                CostCentre *cc;
+                for (cc = CC_LIST; cc != NULL; cc = cc->link) {
+                    fprintf(prof_file, "%d %ld \"%s\" \"%s\"\n",
+                            CC_UQ, cc->ccID, cc->label, cc->module);
+                }
+            }
+        }
     }
     
     if (RtsFlags.ProfFlags.doHeapProfile) {
index 4f42823..0ce17fe 100644 (file)
@@ -499,7 +499,7 @@ hs_exit_(rtsBool wait_foreign)
     // Originally, this was in report_ccs_profiling().  Now, retainer
     // profiling might tack some extra stuff on to the end of this file
     // during endProfiling().
-    fclose(prof_file);
+    if (prof_file != NULL) fclose(prof_file);
 #endif
 
 #if defined(TICKY_TICKY)