summaryrefslogtreecommitdiff
path: root/rts/Messages.c
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2010-05-24 10:55:47 +0000
committerSimon Marlow <marlowsd@gmail.com>2010-05-24 10:55:47 +0000
commitb2e840ee0c95fb549d40950f43cc6e4afc177a46 (patch)
tree59ff4a791bec8b0a35cae94bd5d13045aee31f37 /rts/Messages.c
parentc5e611c7bba08457ededf840903208587fc958a1 (diff)
downloadhaskell-b2e840ee0c95fb549d40950f43cc6e4afc177a46.tar.gz
Add a missing UNTAG_CLOSURE, causing bus errors on Sparc
We just about got away with this on x86 which isn't alignment-sensitive. The result of the memory load is compared against a few different values, but there is a fallback case that happened to be the right thing when the pointer was tagged. A good bug to find, nonetheless.
Diffstat (limited to 'rts/Messages.c')
-rw-r--r--rts/Messages.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/rts/Messages.c b/rts/Messages.c
index 5a1e5bd3c4..91ee9a6574 100644
--- a/rts/Messages.c
+++ b/rts/Messages.c
@@ -183,9 +183,10 @@ nat messageBlackHole(Capability *cap, MessageBlackHole *msg)
return 0;
}
- // we know at this point that the closure
+ // The blackhole must indirect to a TSO, a BLOCKING_QUEUE, an IND,
+ // or a value.
loop:
- p = ((StgInd*)bh)->indirectee;
+ p = UNTAG_CLOSURE(((StgInd*)bh)->indirectee);
info = p->header.info;
if (info == &stg_IND_info)