From 8d0e9847953007239e2c19dd1987f0a78825b897 Mon Sep 17 00:00:00 2001 From: simonm Date: Wed, 3 Feb 1999 16:32:47 +0000 Subject: [PATCH] [project @ 1999-02-03 16:32:47 by simonm] Be more MBLOCK-friendly when allocating and resizing stacks. This should reduce the memory footprint a bit. --- ghc/rts/BlockAlloc.h | 19 ++++++++++++++++++- ghc/rts/Schedule.c | 6 ++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/ghc/rts/BlockAlloc.h b/ghc/rts/BlockAlloc.h index 1ef18d4..a121917 100644 --- a/ghc/rts/BlockAlloc.h +++ b/ghc/rts/BlockAlloc.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: BlockAlloc.h,v 1.3 1999/01/13 17:25:38 simonm Exp $ + * $Id: BlockAlloc.h,v 1.4 1999/02/03 16:32:47 simonm Exp $ * * Block Allocator Interface * @@ -32,6 +32,23 @@ static inline bdescr *Bdescr(StgPtr p) ); } +/* Round a value to megablocks --------------------------------------------- */ + +#define WORDS_PER_MBLOCK (BLOCKS_PER_MBLOCK * BLOCK_SIZE_W) + +static inline nat +round_to_mblocks(nat words) +{ + if (words > WORDS_PER_MBLOCK) { + if ((words % WORDS_PER_MBLOCK) < (WORDS_PER_MBLOCK / 2)) { + words = (words / WORDS_PER_MBLOCK) * WORDS_PER_MBLOCK; + } else { + words = ((words / WORDS_PER_MBLOCK) + 1) * WORDS_PER_MBLOCK; + } + } + return words; +} + /* Debugging -------------------------------------------------------------- */ #ifdef DEBUG diff --git a/ghc/rts/Schedule.c b/ghc/rts/Schedule.c index f7de47a..48f9e39 100644 --- a/ghc/rts/Schedule.c +++ b/ghc/rts/Schedule.c @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: Schedule.c,v 1.7 1999/02/02 14:21:31 simonm Exp $ + * $Id: Schedule.c,v 1.8 1999/02/03 16:32:47 simonm Exp $ * * Scheduler * @@ -107,7 +107,8 @@ initThread(StgTSO *tso, nat stack_size) tso->splim = (P_)&(tso->stack) + RESERVED_STACK_WORDS; tso->stack_size = stack_size; - tso->max_stack_size = RtsFlags.GcFlags.maxStkSize - TSO_STRUCT_SIZEW; + tso->max_stack_size = round_to_mblocks(RtsFlags.GcFlags.maxStkSize) + - TSO_STRUCT_SIZEW; tso->sp = (P_)&(tso->stack) + stack_size; #ifdef PROFILING @@ -676,6 +677,7 @@ threadStackOverflow(StgTSO *tso) new_stack_size = stg_min(tso->stack_size * 2, tso->max_stack_size); new_tso_size = (nat)BLOCK_ROUND_UP(new_stack_size * sizeof(W_) + TSO_STRUCT_SIZE)/sizeof(W_); + new_tso_size = round_to_mblocks(new_tso_size); /* Be MBLOCK-friendly */ new_stack_size = new_tso_size - TSO_STRUCT_SIZEW; IF_DEBUG(scheduler, fprintf(stderr,"increasing stack size from %d words to %d.\n", tso->stack_size, new_stack_size)); -- 1.7.10.4