/* -----------------------------------------------------------------------------
- * $Id: RtsFlags.h,v 1.36 2001/08/07 10:11:05 simonmar Exp $
+ * $Id: RtsFlags.h,v 1.37 2001/08/08 14:14:09 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
nat steps;
rtsBool squeezeUpdFrames;
- rtsBool compact;
+ rtsBool compact; /* True <=> "compact all the time" */
double compactThreshold;
rtsBool ringBell;
/* -----------------------------------------------------------------------------
- * $Id: GC.c,v 1.117 2001/08/08 13:45:02 simonmar Exp $
+ * $Id: GC.c,v 1.118 2001/08/08 14:14:08 simonmar Exp $
*
* (c) The GHC Team 1998-1999
*
RtsFlags.GcFlags.minOldGenSize);
// minimum size for generation zero
- min_alloc = (RtsFlags.GcFlags.pcFreeHeap * max) / 200;
+ min_alloc = stg_max((RtsFlags.GcFlags.pcFreeHeap * max) / 200,
+ RtsFlags.GcFlags.minAllocAreaSize);
+
+ // Auto-enable compaction when the residency reaches a
+ // certain percentage of the maximum heap size (default: 30%).
+ if (RtsFlags.GcFlags.compact ||
+ (max > 0 &&
+ oldest_gen->steps[0].n_blocks >
+ (RtsFlags.GcFlags.compactThreshold * max) / 100)) {
+ oldest_gen->steps[0].is_compacted = 1;
+// fprintf(stderr,"compaction: on\n", live);
+ } else {
+ oldest_gen->steps[0].is_compacted = 0;
+// fprintf(stderr,"compaction: off\n", live);
+ }
// if we're going to go over the maximum heap size, reduce the
// size of the generations accordingly. The calculation is
// different if compaction is turned on, because we don't need
// to double the space required to collect the old generation.
if (max != 0) {
- if (RtsFlags.GcFlags.compact) {
+ if (oldest_gen->steps[0].is_compacted) {
if ( (size + (size - 1) * (gens - 2) * 2) + min_alloc > max ) {
size = (max - min_alloc) / ((gens - 1) * 2 - 1);
}
for (g = 0; g < gens; g++) {
generations[g].max_blocks = size;
}
-
- // Auto-enable compaction when the residency reaches a
- // certain percentage of the maximum heap size (default: 30%).
- if (RtsFlags.GcFlags.compact &&
- max > 0 &&
- oldest_gen->steps[0].n_blocks >
- (RtsFlags.GcFlags.compactThreshold * max) / 100) {
- oldest_gen->steps[0].is_compacted = 1;
-// fprintf(stderr,"compaction: on\n", live);
- } else {
- oldest_gen->steps[0].is_compacted = 0;
-// fprintf(stderr,"compaction: off\n", live);
- }
}
// Guess the amount of live data for stats.
/* -----------------------------------------------------------------------------
- * $Id: RtsFlags.c,v 1.45 2001/08/07 10:37:04 simonmar Exp $
+ * $Id: RtsFlags.c,v 1.46 2001/08/08 14:14:08 simonmar Exp $
*
* (c) The AQUA Project, Glasgow University, 1994-1997
* (c) The GHC Team, 1998-1999
RtsFlags.GcFlags.steps = 2;
RtsFlags.GcFlags.squeezeUpdFrames = rtsTrue;
#endif
- RtsFlags.GcFlags.compact = rtsTrue;
+ RtsFlags.GcFlags.compact = rtsFalse;
RtsFlags.GcFlags.compactThreshold = 30.0;
#ifdef RTS_GTK_FRONTPANEL
RtsFlags.GcFlags.frontpanel = rtsFalse;
" -T<n> Number of steps in younger generations (default: 2)",
" -c<n> Auto-enable compaction of the oldest generation when live data is",
" at least <n>% of the maximum heap size set with -M (default: 30%)",
-" -c Disable compaction",
+" -c Enable compaction for all major collections",
"",
" -t<file> One-line GC statistics (default file: <program>.stat)",
" -s<file> Summary GC statistics (with -Sstderr going to stderr)",
case 'c':
if (rts_argv[arg][2] != '\0') {
- RtsFlags.GcFlags.compact = rtsTrue;
RtsFlags.GcFlags.compactThreshold =
atof(rts_argv[arg]+2);
} else {
- RtsFlags.GcFlags.compact = rtsFalse;
+ RtsFlags.GcFlags.compact = rtsTrue;
}
break;
/* -----------------------------------------------------------------------------
- * $Id: Storage.c,v 1.45 2001/08/08 11:27:17 simonmar Exp $
+ * $Id: Storage.c,v 1.46 2001/08/08 14:14:08 simonmar Exp $
*
* (c) The GHC Team, 1998-1999
*
generations[g].steps[s].to = &generations[g+1].steps[0];
}
- /* The oldest generation has one step. */
+ /* The oldest generation has one step and it is compacted. */
+ if (RtsFlags.GcFlags.compact) {
+ oldest_gen->steps[0].is_compacted = 1;
+ }
oldest_gen->steps[0].to = &oldest_gen->steps[0];
/* generation 0 is special: that's the nursery */