projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Make datatype contexts an extension (on by default) (DatatypeContexts)
[ghc-hetmet.git]
/
rts
/
Messages.c
diff --git
a/rts/Messages.c
b/rts/Messages.c
index
5a1e5bd
..
f7cb809
100644
(file)
--- a/
rts/Messages.c
+++ b/
rts/Messages.c
@@
-161,7
+161,7
@@
nat messageBlackHole(Capability *cap, MessageBlackHole *msg)
const StgInfoTable *info;
StgClosure *p;
StgBlockingQueue *bq;
const StgInfoTable *info;
StgClosure *p;
StgBlockingQueue *bq;
- StgClosure *bh = msg->bh;
+ StgClosure *bh = UNTAG_CLOSURE(msg->bh);
StgTSO *owner;
debugTraceCap(DEBUG_sched, cap, "message: thread %d blocking on blackhole %p",
StgTSO *owner;
debugTraceCap(DEBUG_sched, cap, "message: thread %d blocking on blackhole %p",
@@
-183,9
+183,12
@@
nat messageBlackHole(Capability *cap, MessageBlackHole *msg)
return 0;
}
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:
loop:
- p = ((StgInd*)bh)->indirectee;
+ // NB. VOLATILE_LOAD(), because otherwise gcc hoists the load
+ // and turns this into an infinite loop.
+ p = UNTAG_CLOSURE((StgClosure*)VOLATILE_LOAD(&((StgInd*)bh)->indirectee));
info = p->header.info;
if (info == &stg_IND_info)
info = p->header.info;
if (info == &stg_IND_info)