Commit b19bcfd9 authored by Simon Marlow's avatar Simon Marlow
Browse files

use the new "prim %write_barrier()" in .cmm instead of calls to wb()

parent 47f80964
......@@ -96,7 +96,7 @@ cas(StgVolatilePtr p, StgWord o, StgWord n)
* that require it (not x86 or x86_64).
*/
INLINE_HEADER void
wb(void) {
write_barrier(void) {
#if i386_HOST_ARCH || x86_64_HOST_ARCH
__asm__ __volatile__ ("" : : : "memory");
#elif powerpc_HOST_ARCH
......@@ -136,7 +136,7 @@ unlockClosure(StgClosure *p, StgInfoTable *info)
{
#if i386_HOST_ARCH || x86_64_HOST_ARCH || powerpc_HOST_ARCH
// This is a strictly ordered write, so we need a wb():
wb();
write_barrier();
p->header.info = info;
#else
RELEASE_SM_LOCK;
......@@ -145,7 +145,7 @@ unlockClosure(StgClosure *p, StgInfoTable *info)
#else /* !THREADED_RTS */
#define wb() /* nothing */
#define write_barrier() /* nothing */
INLINE_HEADER StgWord
xchg(StgPtr p, StgWord w)
......
......@@ -240,7 +240,7 @@ check_target:
{
Capability *target_cap;
wb();
write_barrier();
target_cap = target->cap;
if (target_cap == cap && (target->flags & TSO_BLOCKEX) == 0) {
// It's on our run queue and not blocking exceptions
......@@ -464,7 +464,7 @@ blockedThrowTo (StgTSO *source, StgTSO *target)
dirtyTSO(target); // we modified the blocked_exceptions queue
source->block_info.tso = target;
wb(); // throwTo_exception *must* be visible if BlockedOnException is.
write_barrier(); // throwTo_exception *must* be visible if BlockedOnException is.
source->why_blocked = BlockedOnException;
}
......
......@@ -277,7 +277,7 @@ FILL_SLOP(StgClosure *p)
DEBUG_FILL_SLOP(p1); \
LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1); \
StgInd_indirectee(p1) = p2; \
foreign "C" wb() []; \
prim %write_barrier() []; \
bd = Bdescr(p1); \
if (bdescr_gen_no(bd) != 0 :: CInt) { \
foreign "C" recordMutableCap(p1 "ptr", \
......@@ -294,28 +294,28 @@ FILL_SLOP(StgClosure *p)
and_then; \
}
#else
#define updateWithIndirection(ind_info, p1, p2, and_then) \
{ \
bdescr *bd; \
\
/* cas(p1, 0, &stg_WHITEHOLE_info); */ \
ASSERT( (P_)p1 != (P_)p2 && !closure_IND(p1) ); \
DEBUG_FILL_SLOP(p1); \
LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1); \
((StgInd *)p1)->indirectee = p2; \
wb(); \
bd = Bdescr((P_)p1); \
if (bd->gen_no != 0) { \
recordMutableGenLock(p1, &generations[bd->gen_no]); \
SET_INFO(p1, &stg_IND_OLDGEN_info); \
TICK_UPD_OLD_IND(); \
and_then; \
} else { \
SET_INFO(p1, ind_info); \
LDV_RECORD_CREATE(p1); \
TICK_UPD_NEW_IND(); \
and_then; \
} \
#define updateWithIndirection(ind_info, p1, p2, and_then) \
{ \
bdescr *bd; \
\
/* cas(p1, 0, &stg_WHITEHOLE_info); */ \
ASSERT( (P_)p1 != (P_)p2 && !closure_IND(p1) ); \
DEBUG_FILL_SLOP(p1); \
LDV_RECORD_DEAD_FILL_SLOP_DYNAMIC(p1); \
((StgInd *)p1)->indirectee = p2; \
write_barrier(); \
bd = Bdescr((P_)p1); \
if (bd->gen_no != 0) { \
recordMutableGenLock(p1, &generations[bd->gen_no]); \
SET_INFO(p1, &stg_IND_OLDGEN_info); \
TICK_UPD_OLD_IND(); \
and_then; \
} else { \
SET_INFO(p1, ind_info); \
LDV_RECORD_CREATE(p1); \
TICK_UPD_NEW_IND(); \
and_then; \
} \
}
#endif
......
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