projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix the -lm configure test; fixes #4155
[ghc-hetmet.git]
/
rts
/
Messages.c
diff --git
a/rts/Messages.c
b/rts/Messages.c
index
91ee9a6
..
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",
@@
-186,7
+186,9
@@
nat messageBlackHole(Capability *cap, MessageBlackHole *msg)
// The blackhole must indirect to a TSO, a BLOCKING_QUEUE, an IND,
// or a value.
loop:
// The blackhole must indirect to a TSO, a BLOCKING_QUEUE, an IND,
// or a value.
loop:
- p = UNTAG_CLOSURE(((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)