diff options
author | Simon Marlow <marlowsd@gmail.com> | 2009-03-09 12:13:00 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2009-03-09 12:13:00 +0000 |
commit | 9fe7b8ea2136a4a07752b2851840c9366706f832 (patch) | |
tree | cc60d55de58895f8e82432c84711fa0d63544fa2 /rts/sm/Evac.c | |
parent | 1b62aecee4a58f52999cfa53f1c6b7744b29b808 (diff) | |
download | haskell-9fe7b8ea2136a4a07752b2851840c9366706f832.tar.gz |
Redesign 64-bit HEAP_ALLOCED (FIX #2934 at the same time)
After much experimentation, I've found a formulation for HEAP_ALLOCED
that (a) improves performance, and (b) doesn't have any race
conditions when used concurrently. GC performance on x86_64 should be
improved slightly. See extensive comments in MBlock.h for the
details.
Diffstat (limited to 'rts/sm/Evac.c')
-rw-r--r-- | rts/sm/Evac.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/rts/sm/Evac.c b/rts/sm/Evac.c index 8d37f2766b..062b73f069 100644 --- a/rts/sm/Evac.c +++ b/rts/sm/Evac.c @@ -29,6 +29,7 @@ StgWord64 whitehole_spin = 0; #if defined(THREADED_RTS) && !defined(PARALLEL_GC) #define evacuate(p) evacuate1(p) +#define HEAP_ALLOCED_GC(p) HEAP_ALLOCED(p) #endif #if !defined(PARALLEL_GC) @@ -364,7 +365,7 @@ loop: ASSERT(LOOKS_LIKE_CLOSURE_PTR(q)); - if (!HEAP_ALLOCED(q)) { + if (!HEAP_ALLOCED_GC(q)) { if (!major_gc) return; @@ -780,7 +781,7 @@ unchain_thunk_selectors(StgSelector *p, StgClosure *val) // invoke eval_thunk_selector(), the recursive calls will not // evacuate the value (because we want to select on the value, // not evacuate it), so in this case val is in from-space. - // ASSERT(!HEAP_ALLOCED(val) || Bdescr((P_)val)->gen_no > N || (Bdescr((P_)val)->flags & BF_EVACUATED)); + // ASSERT(!HEAP_ALLOCED_GC(val) || Bdescr((P_)val)->gen_no > N || (Bdescr((P_)val)->flags & BF_EVACUATED)); prev = (StgSelector*)((StgClosure *)p)->payload[0]; @@ -834,7 +835,7 @@ eval_thunk_selector (StgClosure **q, StgSelector * p, rtsBool evac) selector_chain: bd = Bdescr((StgPtr)p); - if (HEAP_ALLOCED(p)) { + if (HEAP_ALLOCED_GC(p)) { // If the THUNK_SELECTOR is in to-space or in a generation that we // are not collecting, then bale out early. We won't be able to // save any space in any case, and updating with an indirection is |