summaryrefslogtreecommitdiff
path: root/rts/sm/Evac.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2009-03-09 12:13:00 +0000
committerSimon Marlow <marlowsd@gmail.com>2009-03-09 12:13:00 +0000
commit9fe7b8ea2136a4a07752b2851840c9366706f832 (patch)
treecc60d55de58895f8e82432c84711fa0d63544fa2 /rts/sm/Evac.c
parent1b62aecee4a58f52999cfa53f1c6b7744b29b808 (diff)
downloadhaskell-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.c7
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