/* -----------------------------------------------------------------------------
- * $Id: GC.c,v 1.121 2001/08/17 15:46:54 simonmar Exp $
+ * $Id: GC.c,v 1.123 2001/10/01 10:52:36 simonmar Exp $
*
* (c) The GHC Team 1998-1999
*
// 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)) {
+ if (RtsFlags.GcFlags.generations > 1 &&
+ (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 {
// different if compaction is turned on, because we don't need
// to double the space required to collect the old generation.
if (max != 0) {
+
+ // this test is necessary to ensure that the calculations
+ // below don't have any negative results - we're working
+ // with unsigned values here.
+ if (max < min_alloc) {
+ heapOverflow();
+ }
+
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);