[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