From 53a442f10d80cd85b33620a023c4a8749a7c0b20 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Thu, 7 Feb 2008 12:24:45 +0000 Subject: [PATCH] Tweaks to stack squeezing 1. We weren't squeezing two frames if one of them was a marked update frame. This is easy to fix. 2. The heuristic to decide whether to squeeze was a little conservative. It's worth copying 3 words to save an update frame. --- rts/ThreadPaused.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/rts/ThreadPaused.c b/rts/ThreadPaused.c index 5b64f76..3aa66ed 100644 --- a/rts/ThreadPaused.c +++ b/rts/ThreadPaused.c @@ -50,7 +50,7 @@ stackSqueeze(StgTSO *tso, StgPtr bottom) current_gap_size = 0; gap = (struct stack_gap *) (tso->sp - sizeofW(StgUpdateFrame)); - while (frame < bottom) { + while (frame <= bottom) { info = get_ret_itbl((StgClosure *)frame); switch (info->i.type) { @@ -202,6 +202,11 @@ threadPaused(Capability *cap, StgTSO *tso) while (1) { // If we've already marked this frame, then stop here. if (frame->header.info == (StgInfoTable *)&stg_marked_upd_frame_info) { + if (prev_was_update_frame) { + words_to_squeeze += sizeofW(StgUpdateFrame); + weight += weight_pending; + weight_pending = 0; + } goto end; } @@ -305,7 +310,7 @@ end: // the number of words we have to shift down is less than the // number of stack words we squeeze away by doing so. if (RtsFlags.GcFlags.squeezeUpdFrames == rtsTrue && - weight < words_to_squeeze) { + ((weight <= 4 && words_to_squeeze > 0) || weight < words_to_squeeze)) { stackSqueeze(tso, (StgPtr)frame); } } -- 1.7.10.4