/* -----------------------------------------------------------------------------
- * $Id: Profiling.c,v 1.19 2000/04/19 12:42:48 simonmar Exp $
+ * $Id: Profiling.c,v 1.24 2001/10/18 14:41:01 simonmar Exp $
*
* (c) The GHC Team, 1998-2000
*
#ifdef PROFILING
+#include "PosixSource.h"
#include "Rts.h"
#include "RtsUtils.h"
#include "RtsFlags.h"
#include "Proftimer.h"
#include "Itimer.h"
#include "ProfHeap.h"
+#include "Arena.h"
+
+/*
+ * Profiling allocation arena.
+ */
+Arena *prof_arena;
/*
* Global variables used to assign unique IDs to cc's, ccs's, and
* Static Functions
*/
-static CostCentreStack * ActualPush_ ( CostCentreStack *ccs, CostCentre *cc,
- CostCentreStack *new_ccs );
+static CostCentreStack * ActualPush_ ( CostCentreStack *ccs, CostCentre *cc,
+ CostCentreStack *new_ccs );
+static rtsBool ccs_to_ignore ( CostCentreStack *ccs );
+static void count_ticks ( CostCentreStack *ccs );
+static void inherit_costs ( CostCentreStack *ccs );
+static void reportCCS ( CostCentreStack *ccs, nat indent );
+static void DecCCS ( CostCentreStack *ccs );
+static void DecBackEdge ( CostCentreStack *ccs,
+ CostCentreStack *oldccs );
+static CostCentreStack * CheckLoop ( CostCentreStack *ccs, CostCentre *cc );
+static CostCentreStack * pruneCCSTree ( CostCentreStack *ccs );
+static CostCentreStack * ActualPush ( CostCentreStack *, CostCentre * );
+static CostCentreStack * IsInIndexTable ( IndexTable *, CostCentre * );
+static IndexTable * AddToIndexTable ( IndexTable *, CostCentreStack *,
+ CostCentre *, unsigned int );
-static rtsBool ccs_to_ignore ( CostCentreStack *ccs );
-static void count_ticks ( CostCentreStack *ccs );
-static void reportCCS ( CostCentreStack *ccs, nat indent );
-static void DecCCS ( CostCentreStack *ccs );
-static void DecBackEdge ( CostCentreStack *ccs, CostCentreStack *oldccs );
-static CostCentreStack *CheckLoop ( CostCentreStack *ccs, CostCentre *cc );
-static CostCentreStack *pruneCCSTree ( CostCentreStack *ccs );
-static CostCentreStack *ActualPush ( CostCentreStack *, CostCentre * );
-static CostCentreStack *IsInIndexTable ( IndexTable *, CostCentre * );
-static IndexTable *AddToIndexTable ( IndexTable *, CostCentreStack *,
- CostCentre *, unsigned int );
#ifdef DEBUG
static void printCCS ( CostCentreStack *ccs );
void
initProfiling1 (void)
{
+ // initialise our arena
+ prof_arena = newArena();
+
/* for the benefit of allocate()... */
CCCS = CCS_SYSTEM;
initProfilingLogFile(void)
{
/* Initialise the log file name */
- prof_filename = stgMallocBytes(strlen(prog_argv[0]) + 6, "initProfiling");
+ prof_filename = arenaAlloc(prof_arena, strlen(prog_argv[0]) + 6);
sprintf(prof_filename, "%s.prof", prog_argv[0]);
/* open the log file */
if (RtsFlags.ProfFlags.doHeapProfile) {
/* Initialise the log file name */
- hp_filename = stgMallocBytes(strlen(prog_argv[0]) + 6, "initProfiling");
+ hp_filename = arenaAlloc(prof_arena, strlen(prog_argv[0]) + 6);
sprintf(hp_filename, "%s.hp", prog_argv[0]);
/* open the log file */
CostCentreStack *new_ccs;
/* allocate space for a new CostCentreStack */
- new_ccs = (CostCentreStack *) stgMallocBytes(sizeof(CostCentreStack), "Error allocating space for CostCentreStack");
+ new_ccs = (CostCentreStack *) arenaAlloc(prof_arena, sizeof(CostCentreStack));
return ActualPush_(ccs, cc, new_ccs);
}
/* Initialise the various _scc_ counters to zero
*/
new_ccs->scc_count = 0;
- new_ccs->sub_scc_count = 0;
- new_ccs->sub_cafcc_count = 0;
/* Initialize all other stats here. There should be a quick way
* that's easily used elsewhere too
*/
new_ccs->time_ticks = 0;
new_ccs->mem_alloc = 0;
+ new_ccs->inherited_ticks = 0;
+ new_ccs->inherited_alloc = 0;
new_ccs->root = ccs->root;
{
IndexTable *new_it;
- new_it = stgMallocBytes(sizeof(IndexTable), "AddToIndexTable");
+ new_it = arenaAlloc(prof_arena, sizeof(IndexTable));
new_it->cc = cc;
new_it->ccs = new_ccs;
}
-void
-print_ccs (FILE *fp, CostCentreStack *ccs)
-{
- if (ccs == CCCS) {
- fprintf(fp, "Cost-Centre Stack: ");
- }
-
- if (ccs != CCS_MAIN)
- {
- print_ccs(fp, ccs->prevStack);
- fprintf(fp, "->[%s,%s]", ccs->cc->label, ccs->cc->module);
- } else {
- fprintf(fp, "[%s,%s]", ccs->cc->label, ccs->cc->module);
- }
-
- if (ccs == CCCS) {
- fprintf(fp, "\n");
- }
-}
-
-
static void
DecCCS(CostCentreStack *ccs)
{
for (cc = CC_LIST; cc != NULL; cc = next) {
next = cc->link;
if (cc->time_ticks > total_prof_ticks/100
- || cc->mem_alloc > total_alloc/100) {
+ || cc->mem_alloc > total_alloc/100
+ || RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_ALL) {
insert_cc_in_sorted_list(cc);
}
}
);
if (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE) {
- fprintf(prof_file, " %5ld %9ld", cc->time_ticks, cc->mem_alloc);
+ fprintf(prof_file, " %5ld %9lld", cc->time_ticks, cc->mem_alloc);
}
fprintf(prof_file, "\n");
}
static void
fprint_header( void )
{
- fprintf(prof_file, "%-24s %-10s", "COST CENTRE", "MODULE");
+ fprintf(prof_file, "%-24s %-10s individual inherited\n", "", "");
- fprintf(prof_file, "%8s %5s %5s %8s %5s", "scc", "%time", "%alloc", "inner", "cafs");
+ fprintf(prof_file, "%-24s %-10s", "COST CENTRE", "MODULE");
+ fprintf(prof_file, "%8s %5s %5s %5s %5s", "entries", "%time", "%alloc", "%time", "%alloc");
if (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE) {
fprintf(prof_file, " %5s %9s", "ticks", "bytes");
report_per_cc_costs();
+ inherit_costs(CCS_MAIN);
+
fprint_header();
reportCCS(pruneCCSTree(CCS_MAIN), 0);
fprintf(prof_file, "%-*s%-*s %-10s",
indent, "", 24-indent, cc->label, cc->module);
- fprintf(prof_file, "%8ld %5.1f %5.1f %8ld %5ld",
+ fprintf(prof_file, "%8lld %5.1f %5.1f %5.1f %5.1f",
ccs->scc_count,
total_prof_ticks == 0 ? 0.0 : (ccs->time_ticks / (StgFloat) total_prof_ticks * 100),
total_alloc == 0 ? 0.0 : (ccs->mem_alloc / (StgFloat) total_alloc * 100),
- ccs->sub_scc_count, ccs->sub_cafcc_count);
-
+ total_prof_ticks == 0 ? 0.0 : (ccs->inherited_ticks / (StgFloat) total_prof_ticks * 100),
+ total_alloc == 0 ? 0.0 : (ccs->inherited_alloc / (StgFloat) total_alloc * 100)
+ );
+
if (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE) {
- fprintf(prof_file, " %5ld %9ld", ccs->time_ticks, ccs->mem_alloc*sizeof(W_));
+ fprintf(prof_file, " %5ld %9lld", ccs->time_ticks, ccs->mem_alloc*sizeof(W_));
#if defined(PROFILING_DETAIL_COUNTS)
fprintf(prof_file, " %8ld %8ld %8ld %8ld %8ld %8ld %8ld",
ccs->mem_allocs, ccs->thunk_count,
}
}
+
/* Traverse the cost centre stack tree and accumulate
* ticks/allocations.
*/
}
}
+/* Traverse the cost centre stack tree and inherit ticks & allocs.
+ */
+static void
+inherit_costs(CostCentreStack *ccs)
+{
+ IndexTable *i;
+
+ if (ccs_to_ignore(ccs)) { return; }
+
+ ccs->inherited_ticks += ccs->time_ticks;
+ ccs->inherited_alloc += ccs->mem_alloc;
+
+ for (i = ccs->indexTable; i != NULL; i = i->next)
+ if (!i->back_edge) {
+ inherit_costs(i->ccs);
+ ccs->inherited_ticks += i->ccs->inherited_ticks;
+ ccs->inherited_alloc += i->ccs->inherited_alloc;
+ }
+
+ return;
+}
+
/* return rtsTrue if it is one of the ones that
* should not be reported normally (because it confuses
* the users)
/* force printing of *all* cost centres if -P -P */ )
|| ( ccs->indexTable != 0 )
- || ( (ccs->scc_count || ccs->sub_scc_count ||
- ccs->time_ticks || ccs->mem_alloc
- || (RtsFlags.CcFlags.doCostCentres >= COST_CENTRES_VERBOSE
- && (ccs->sub_cafcc_count
-#if defined(PROFILING_DETAIL_COUNTS)
- || cc->thunk_count || cc->function_count || cc->pap_count
-#endif
- ))))) {
- return ccs;
+ || ( ccs->scc_count || ccs->time_ticks || ccs->mem_alloc )
+ ) {
+ return ccs;
} else {
- return NULL;
+ return NULL;
}
}
cc = ccs->cc;
- fprintf(prof_file, " 1 %d %lu %lu %lu",
+ fprintf(prof_file, " 1 %d %llu %lu %llu",
ccs->ccsID, ccs->scc_count, ccs->time_ticks, ccs->mem_alloc);
for (i = ccs->indexTable; i != 0; i = i->next) {
}
}
+void
+print_ccs (FILE *fp, CostCentreStack *ccs)
+{
+ if (ccs == CCCS) {
+ fprintf(fp, "Cost-Centre Stack: ");
+ }
+
+ if (ccs != CCS_MAIN)
+ {
+ print_ccs(fp, ccs->prevStack);
+ fprintf(fp, "->[%s,%s]", ccs->cc->label, ccs->cc->module);
+ } else {
+ fprintf(fp, "[%s,%s]", ccs->cc->label, ccs->cc->module);
+ }
+
+ if (ccs == CCCS) {
+ fprintf(fp, "\n");
+ }
+}
+
+
#ifdef DEBUG
static void
printCCS ( CostCentreStack *ccs )