[commit: ghc] local-gc: merge (e684cb6)
Simon Marlow
marlowsd at gmail.com
Mon Jun 6 05:56:59 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/ghc
On branch : local-gc
http://hackage.haskell.org/trac/ghc/changeset/e684cb6c41a494048c50d3fe109b42437d25b5c3
>---------------------------------------------------------------
commit e684cb6c41a494048c50d3fe109b42437d25b5c3
Merge: f0e9125... 1fb3844...
Author: Simon Marlow <marlowsd at gmail.com>
Date: Sun Jun 5 14:31:30 2011 +0100
merge
compiler/main/SysTools.lhs | 2 +-
rts/Capability.c | 3 +--
rts/Stats.c | 16 ++++++++--------
rts/Task.c | 4 ++--
rts/sm/GC.c | 1 +
utils/ghc-pkg/ghc.mk | 6 ++++--
6 files changed, 17 insertions(+), 15 deletions(-)
diff --cc rts/Stats.c
index 5f18a56,159a909..1162d2b
--- a/rts/Stats.c
+++ b/rts/Stats.c
@@@ -165,13 -165,13 +165,13 @@@ initStats1 (void
statsPrintf(" Alloc Copied Live GC GC TOT TOT Page Flts\n");
statsPrintf(" bytes bytes bytes user elap user elap\n");
}
-- GC_coll_cpu =
-- (Ticks *)stgMallocBytes(
- sizeof(Ticks)*RtsFlags.GcFlags.generations,
++ GC_coll_cpu =
++ (Ticks *)stgMallocBytes(
+ sizeof(Ticks)*total_generations,
"initStats");
-- GC_coll_elapsed =
-- (Ticks *)stgMallocBytes(
- sizeof(Ticks)*RtsFlags.GcFlags.generations,
++ GC_coll_elapsed =
++ (Ticks *)stgMallocBytes(
+ sizeof(Ticks)*total_generations,
"initStats");
GC_coll_max_pause =
(Ticks *)stgMallocBytes(
@@@ -332,46 -326,29 +332,46 @@@ stat_endGC (gc_thread *gct
taskDoneGC(gct->cap->running_task, thread_gc_cpu, gc_elapsed);
- if (RtsFlags.GcFlags.giveStats == VERBOSE_GC_STATS) {
- nat faults = getPageFaults();
+ if (gct->gc_type == GC_LOCAL) {
+ gen_ix = gct->index;
+ } else {
+ gen_ix = old_generations[gct->collect_gen].ix;
+ }
+
+ if (RtsFlags.GcFlags.giveStats == VERBOSE_GC_STATS) {
- nat faults = getPageFaults();
++ nat faults = getPageFaults();
statsPrintf("%9ld %9ld %9ld",
alloc*sizeof(W_), copied*sizeof(W_),
live*sizeof(W_));
- statsPrintf(" %5.2f %5.2f %7.2f %7.2f %4ld %4ld ",
- statsPrintf(" %5.2f %5.2f %7.2f %7.2f %4ld %4ld (Gen: %2d)\n",
- TICK_TO_DBL(gc_cpu),
++ statsPrintf(" %5.2f %5.2f %7.2f %7.2f %4ld %4ld ",
+ TICK_TO_DBL(gc_cpu),
TICK_TO_DBL(gc_elapsed),
TICK_TO_DBL(cpu),
TICK_TO_DBL(elapsed - start_init_elapsed),
faults - gct->gc_start_faults,
- gct->gc_start_faults - GC_end_faults,
- gen);
-
- GC_end_faults = faults;
- statsFlush();
+ gct->gc_start_faults - GC_end_faults);
+
+ switch (gct->gc_type) {
+ case GC_LOCAL:
+ statsPrintf("(G0.%d, loc)", gct->index);
+ break;
+ case GC_PAR:
+ statsPrintf("(G%d, par)", gct->collect_gen);
+ break;
+ case GC_SEQ:
+ statsPrintf("(G%d)", gct->collect_gen);
+ break;
+ }
+ statsPrintf("\n");
+ GC_end_faults = faults;
- statsFlush();
++ statsFlush();
}
- GC_coll_cpu[gen_ix] += gc_cpu;
- GC_coll_cpu[gen] += gc_cpu;
- GC_coll_elapsed[gen] += gc_elapsed;
- if (GC_coll_max_pause[gen] < gc_elapsed) {
- GC_coll_max_pause[gen] = gc_elapsed;
++ GC_coll_cpu[gen_ix] += gc_cpu;
+ GC_coll_elapsed[gen_ix] += gc_elapsed;
+ if (GC_coll_max_pause[gen_ix] < gc_elapsed) {
+ GC_coll_max_pause[gen_ix] = gc_elapsed;
}
GC_tot_copied += (StgWord64) copied;
@@@ -570,17 -542,12 +570,17 @@@ stat_exit(int alloc
statsPrintf(" %5.2f %5.2f\n\n", 0.0, 0.0);
}
- for (i = 0; i < RtsFlags.GcFlags.generations; i++) {
- gc_cpu += GC_coll_cpu[i];
- gc_elapsed += GC_coll_elapsed[i];
+ for (i = 0; i < total_generations; i++) {
+ if (all_generations[i].is_local) {
+ gc_local_cpu += GC_coll_cpu[i];
+ gc_local_elapsed += GC_coll_elapsed[i];
+ } else {
+ gc_global_cpu += GC_coll_cpu[i];
+ gc_global_elapsed += GC_coll_elapsed[i];
+ }
}
-- if (RtsFlags.GcFlags.giveStats >= SUMMARY_GC_STATS) {
++ if (RtsFlags.GcFlags.giveStats >= SUMMARY_GC_STATS) {
showStgWord64(GC_tot_alloc*sizeof(W_),
temp, rtsTrue/*commas*/);
statsPrintf("%16s bytes allocated in the heap\n", temp);
@@@ -589,17 -556,9 +589,17 @@@
temp, rtsTrue/*commas*/);
statsPrintf("%16s bytes copied during GC\n", temp);
- if ( residency_samples > 0 ) {
+ for (i = 0; i < n_capabilities; i++) {
+ globalised += gc_threads[i]->globalised;
+ }
+
+ showStgWord64(globalised * sizeof(W_),
+ temp, rtsTrue/*commas*/);
+ statsPrintf("%16s bytes globalised\n", temp);
+
+ if ( residency_samples > 0 ) {
showStgWord64(max_residency*sizeof(W_),
-- temp, rtsTrue/*commas*/);
++ temp, rtsTrue/*commas*/);
statsPrintf("%16s bytes maximum residency (%ld sample(s))\n",
temp, residency_samples);
}
diff --cc rts/Task.c
index aa17749,e77a030..5f2ec5b
--- a/rts/Task.c
+++ b/rts/Task.c
@@@ -323,10 -323,10 +323,10 @@@ taskTimeStamp (Task *task USED_IF_THREA
currentUserTime = getThreadCPUTime();
currentElapsedTime = getProcessElapsedTime();
- task->mut_time =
- currentUserTime - task->muttimestart - task->gc_time;
+ task->mut_time =
- currentUserTime - task->muttimestart - task->gc_time;
++ currentUserTime - task->muttimestart - task->gc_time;
task->mut_etime =
- currentElapsedTime - task->elapsedtimestart - task->gc_etime;
+ currentElapsedTime - task->elapsedtimestart - task->gc_etime;
if (task->gc_time < 0) { task->gc_time = 0; }
if (task->gc_etime < 0) { task->gc_etime = 0; }
diff --cc rts/sm/GC.c
index a642778,d0dd44d..ba4aab2
--- a/rts/sm/GC.c
+++ b/rts/sm/GC.c
@@@ -200,11 -199,9 +200,12 @@@ GarbageCollect (nat N, // generation t
ASSERT(sizeof(gen_workspace) == 16 * sizeof(StgWord));
// otherwise adjust the padding in gen_workspace.
+ // this is the main thread
SET_GCT(gc_threads[cap->no]);
+ gct->gc_type = gc_type;
+ major_gc = (N == RtsFlags.GcFlags.generations-1);
+
// tell the stats department that we've started a GC
stat_startGC(gct);
diff --cc rts/sm/GCThread.h
index dde9fe2,e42a3a1..15e104a
--- a/rts/sm/GCThread.h
+++ b/rts/sm/GCThread.h
@@@ -169,36 -165,9 +169,36 @@@ typedef struct gc_thread_
// instead of the to-space
// corresponding to the object
-- lnat thunk_selector_depth; // used to avoid unbounded recursion in
++ lnat thunk_selector_depth; // used to avoid unbounded recursion in
// evacuate() for THUNK_SELECTOR
+ nat collect_gen; // maximum generation (no) to collect
+
+ nat gc_type; // The gc type (GC_SEQ, GC_PAR, GC_LOCAL)
+
+ rtsBool globalise_thunks; // whether to globalise THUNK objects
+
+ StgTSO *resurrected_threads; // threads found to be unreachable,
+ // linked by ->global_link field.
+
+ StgTSO *exception_threads; // List of blocked threads found to
+ // have pending throwTos
+
+ /* Which stage of processing various kinds of weak pointer are we at?
+ * (see traverse_weak_ptr_list() below for discussion).
+ */
+ enum { WeakPtrs, WeakThreads, WeakDone } weak_stage;
+
+ StgWeak *old_weak_ptrs;
+
+ // --------------------
+ // The mark stack
+
+ bdescr *mark_stack_top_bd; // topmost block in the mark stack
+ bdescr *mark_stack_bd; // current block in the mark stack
+ StgPtr mark_sp; // pointer to the next unallocated mark
+ // stack entry
+
#ifdef USE_PAPI
int papi_events;
#endif
More information about the Cvs-ghc
mailing list