Commit 565f3c75 authored by Simon Marlow's avatar Simon Marlow
Browse files

messageBlackHole: fix deadlock bug caused by a missing 'volatile'

parent 5ac6359e
......@@ -293,6 +293,12 @@ load_load_barrier(void) {
#endif
}
// Load a pointer from a memory location that might be being modified
// concurrently. This prevents the compiler from optimising away
// multiple loads of the memory location, as it might otherwise do in
// a busy wait loop for example.
#define VOLATILE_LOAD(p) (*((StgVolatilePtr)(p)))
/* ---------------------------------------------------------------------- */
#else /* !THREADED_RTS */
......@@ -331,6 +337,8 @@ atomic_dec(StgVolatilePtr p)
return --(*p);
}
#define VOLATILE_LOAD(p) ((StgWord)*((StgWord*)(p)))
#endif /* !THREADED_RTS */
#endif /* SMP_H */
......@@ -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:
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)
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment