[commit: ghc] master: Make retainer profiling use the label length (-L) flag) (d5adcc5)

Ian Lynagh igloo at earth.li
Sat May 7 21:34:22 CEST 2011


Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/d5adcc5d95a11812f6a4f45316aa4fbdc5da390e

>---------------------------------------------------------------

commit d5adcc5d95a11812f6a4f45316aa4fbdc5da390e
Author: Ian Lynagh <igloo at earth.li>
Date:   Fri May 6 15:28:53 2011 +0100

    Make retainer profiling use the label length (-L) flag)

>---------------------------------------------------------------

 rts/ProfHeap.c    |    2 +-
 rts/RetainerSet.c |   75 ++++++++++++++++++++++++----------------------------
 rts/RetainerSet.h |    2 +-
 3 files changed, 37 insertions(+), 42 deletions(-)

diff --git a/rts/ProfHeap.c b/rts/ProfHeap.c
index f7fbd32..9bd707f 100644
--- a/rts/ProfHeap.c
+++ b/rts/ProfHeap.c
@@ -812,7 +812,7 @@ dumpCensus( Census *census )
 		rs->id = -(rs->id);
 
 	    // report in the unit of bytes: * sizeof(StgWord)
-	    printRetainerSetShort(hp_file, rs);
+	    printRetainerSetShort(hp_file, rs, RtsFlags.ProfFlags.ccsLength);
 	    break;
 	}
 	default:
diff --git a/rts/RetainerSet.c b/rts/RetainerSet.c
index 5e9b37c..d93ae4b 100644
--- a/rts/RetainerSet.c
+++ b/rts/RetainerSet.c
@@ -265,35 +265,34 @@ printRetainer(FILE *f, retainer cc)
 #if defined(RETAINER_SCHEME_INFO)
 // Retainer scheme 1: retainer = info table
 void
-printRetainerSetShort(FILE *f, RetainerSet *rs)
+printRetainerSetShort(FILE *f, RetainerSet *rs, nat max_length)
 {
-#define MAX_RETAINER_SET_SPACE  24
-    char tmp[MAX_RETAINER_SET_SPACE + 1];
+    char tmp[max_length + 1];
     int size;
     nat j;
 
     ASSERT(rs->id < 0);
 
-    tmp[MAX_RETAINER_SET_SPACE] = '\0';
+    tmp[max_length] = '\0';
 
     // No blank characters are allowed.
     sprintf(tmp + 0, "(%d)", -(rs->id));
     size = strlen(tmp);
-    ASSERT(size < MAX_RETAINER_SET_SPACE);
+    ASSERT(size < max_length);
 
     for (j = 0; j < rs->num; j++) {
 	if (j < rs->num - 1) {
-	    strncpy(tmp + size, GET_PROF_DESC(rs->element[j]), MAX_RETAINER_SET_SPACE - size);
+	    strncpy(tmp + size, GET_PROF_DESC(rs->element[j]), max_length - size);
 	    size = strlen(tmp);
-	    if (size == MAX_RETAINER_SET_SPACE)
+	    if (size == max_length)
 		break;
-	    strncpy(tmp + size, ",", MAX_RETAINER_SET_SPACE - size);
+	    strncpy(tmp + size, ",", max_length - size);
 	    size = strlen(tmp);
-	    if (size == MAX_RETAINER_SET_SPACE)
+	    if (size == max_length)
 		break;
 	}
 	else {
-	    strncpy(tmp + size, GET_PROF_DESC(rs->element[j]), MAX_RETAINER_SET_SPACE - size);
+	    strncpy(tmp + size, GET_PROF_DESC(rs->element[j]), max_length - size);
 	    // size = strlen(tmp);
 	}
     }
@@ -302,10 +301,9 @@ printRetainerSetShort(FILE *f, RetainerSet *rs)
 #elif defined(RETAINER_SCHEME_CC)
 // Retainer scheme 3: retainer = cost centre
 void
-printRetainerSetShort(FILE *f, RetainerSet *rs)
+printRetainerSetShort(FILE *f, RetainerSet *rs, nat max_length)
 {
-#define MAX_RETAINER_SET_SPACE  24
-    char tmp[MAX_RETAINER_SET_SPACE + 1];
+    char tmp[max_length + 1];
     int size;
     nat j;
 
@@ -313,35 +311,34 @@ printRetainerSetShort(FILE *f, RetainerSet *rs)
 #elif defined(RETAINER_SCHEME_CCS)
 // Retainer scheme 2: retainer = cost centre stack
 void
-printRetainerSetShort(FILE *f, RetainerSet *rs)
+printRetainerSetShort(FILE *f, RetainerSet *rs, nat max_length)
 {
-#define MAX_RETAINER_SET_SPACE  24
-    char tmp[MAX_RETAINER_SET_SPACE + 1];
-    int size;
+    char tmp[max_length + 1];
+    nat size;
     nat j;
 
     ASSERT(rs->id < 0);
 
-    tmp[MAX_RETAINER_SET_SPACE] = '\0';
+    tmp[max_length] = '\0';
 
     // No blank characters are allowed.
     sprintf(tmp + 0, "(%d)", -(rs->id));
     size = strlen(tmp);
-    ASSERT(size < MAX_RETAINER_SET_SPACE);
+    ASSERT(size < max_length);
 
     for (j = 0; j < rs->num; j++) {
 	if (j < rs->num - 1) {
-	    strncpy(tmp + size, rs->element[j]->cc->label, MAX_RETAINER_SET_SPACE - size);
+	    strncpy(tmp + size, rs->element[j]->cc->label, max_length - size);
 	    size = strlen(tmp);
-	    if (size == MAX_RETAINER_SET_SPACE)
+	    if (size == max_length)
 		break;
-	    strncpy(tmp + size, ",", MAX_RETAINER_SET_SPACE - size);
+	    strncpy(tmp + size, ",", max_length - size);
 	    size = strlen(tmp);
-	    if (size == MAX_RETAINER_SET_SPACE)
+	    if (size == max_length)
 		break;
 	}
 	else {
-	    strncpy(tmp + size, rs->element[j]->cc->label, MAX_RETAINER_SET_SPACE - size);
+	    strncpy(tmp + size, rs->element[j]->cc->label, max_length - size);
 	    // size = strlen(tmp);
 	}
     }
@@ -350,46 +347,44 @@ printRetainerSetShort(FILE *f, RetainerSet *rs)
 #elif defined(RETAINER_SCHEME_CC)
 // Retainer scheme 3: retainer = cost centre
 static void
-printRetainerSetShort(FILE *f, retainerSet *rs)
+printRetainerSetShort(FILE *f, retainerSet *rs, nat max_length)
 {
-#define MAX_RETAINER_SET_SPACE  24
-    char tmp[MAX_RETAINER_SET_SPACE + 1];
+    char tmp[max_length + 1];
     int size;
     nat j;
 
     ASSERT(rs->id < 0);
 
-    tmp[MAX_RETAINER_SET_SPACE] = '\0';
+    tmp[max_length] = '\0';
 
     // No blank characters are allowed.
     sprintf(tmp + 0, "(%d)", -(rs->id));
     size = strlen(tmp);
-    ASSERT(size < MAX_RETAINER_SET_SPACE);
+    ASSERT(size < max_length);
 
     for (j = 0; j < rs->num; j++) {
 	if (j < rs->num - 1) {
 	    strncpy(tmp + size, rs->element[j]->label,
-		    MAX_RETAINER_SET_SPACE - size);
+		    max_length - size);
 	    size = strlen(tmp);
-	    if (size == MAX_RETAINER_SET_SPACE)
+	    if (size == max_length)
 		break;
-	    strncpy(tmp + size, ",", MAX_RETAINER_SET_SPACE - size);
+	    strncpy(tmp + size, ",", max_length - size);
 	    size = strlen(tmp);
-	    if (size == MAX_RETAINER_SET_SPACE)
+	    if (size == max_length)
 		break;
 	}
 	else {
 	    strncpy(tmp + size, rs->element[j]->label,
-		    MAX_RETAINER_SET_SPACE - size);
+		    max_length - size);
 	    // size = strlen(tmp);
 	}
     }
     fprintf(f, tmp);
 /*
-  #define MAX_RETAINER_SET_SPACE  24
   #define DOT_NUMBER              3
-  // 1. 32 > MAX_RETAINER_SET_SPACE + 1 (1 for '\0')
-  // 2. (MAX_RETAINER_SET_SPACE - DOT_NUMBER ) characters should be enough for
+  // 1. 32 > max_length + 1 (1 for '\0')
+  // 2. (max_length - DOT_NUMBER ) characters should be enough for
   //    printing one natural number (plus '(' and ')').
   char tmp[32];
   int size, ts;
@@ -400,12 +395,12 @@ printRetainerSetShort(FILE *f, retainerSet *rs)
   // No blank characters are allowed.
   sprintf(tmp + 0, "(%d)", -(rs->id));
   size = strlen(tmp);
-  ASSERT(size < MAX_RETAINER_SET_SPACE - DOT_NUMBER);
+  ASSERT(size < max_length - DOT_NUMBER);
 
   for (j = 0; j < rs->num; j++) {
     ts = strlen(rs->element[j]->label);
     if (j < rs->num - 1) {
-      if (size + ts + 1 > MAX_RETAINER_SET_SPACE - DOT_NUMBER) {
+      if (size + ts + 1 > max_length - DOT_NUMBER) {
         sprintf(tmp + size, "...");
         break;
       }
@@ -413,7 +408,7 @@ printRetainerSetShort(FILE *f, retainerSet *rs)
       size += ts + 1;
     }
     else {
-      if (size + ts > MAX_RETAINER_SET_SPACE - DOT_NUMBER) {
+      if (size + ts > max_length - DOT_NUMBER) {
         sprintf(tmp + size, "...");
         break;
       }
diff --git a/rts/RetainerSet.h b/rts/RetainerSet.h
index 74152b9..5004527 100644
--- a/rts/RetainerSet.h
+++ b/rts/RetainerSet.h
@@ -165,7 +165,7 @@ void traverseAllRetainerSet(void (*f)(RetainerSet *));
 
 #ifdef SECOND_APPROACH
 // Prints a single retainer set.
-void printRetainerSetShort(FILE *, RetainerSet *);
+void printRetainerSetShort(FILE *, RetainerSet *, nat);
 #endif
 
 // Print the statistics on all the retainer sets.





More information about the Cvs-ghc mailing list