diff options
author | Ben Gamari <ben@smart-cactus.org> | 2020-03-05 18:42:18 -0500 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2020-05-21 12:13:01 -0400 |
commit | 78c6523c5106fc56b653fc14fda5741913da8fdc (patch) | |
tree | f9c41cbb3d63ac81c168a3a0e311f146866c8025 | |
parent | 24e61aad37355fa3a5503b11a60ab7b314a3f405 (diff) | |
download | haskell-78c6523c5106fc56b653fc14fda5741913da8fdc.tar.gz |
nonmoving: Optimise the write barrier
-rw-r--r-- | rts/Updates.h | 39 |
1 files changed, 18 insertions, 21 deletions
diff --git a/rts/Updates.h b/rts/Updates.h index 91d1b0b1cb..608aaff524 100644 --- a/rts/Updates.h +++ b/rts/Updates.h @@ -50,22 +50,21 @@ \ prim_write_barrier; \ OVERWRITING_CLOSURE(p1); \ - IF_NONMOVING_WRITE_BARRIER_ENABLED { \ - ccall updateRemembSetPushThunk_(BaseReg, p1 "ptr"); \ - } \ - StgInd_indirectee(p1) = p2; \ - prim_write_barrier; \ - SET_INFO(p1, stg_BLACKHOLE_info); \ - LDV_RECORD_CREATE(p1); \ bd = Bdescr(p1); \ if (bdescr_gen_no(bd) != 0 :: bits16) { \ + IF_NONMOVING_WRITE_BARRIER_ENABLED { \ + ccall updateRemembSetPushThunk_(BaseReg, p1 "ptr"); \ + } \ recordMutableCap(p1, TO_W_(bdescr_gen_no(bd))); \ TICK_UPD_OLD_IND(); \ - and_then; \ } else { \ TICK_UPD_NEW_IND(); \ - and_then; \ - } + } \ + StgInd_indirectee(p1) = p2; \ + prim_write_barrier; \ + SET_INFO(p1, stg_BLACKHOLE_info); \ + LDV_RECORD_CREATE(p1); \ + and_then; #else /* !CMINUSMINUS */ @@ -73,28 +72,26 @@ INLINE_HEADER void updateWithIndirection (Capability *cap, StgClosure *p1, StgClosure *p2) { - bdescr *bd; - ASSERT( (P_)p1 != (P_)p2 ); /* not necessarily true: ASSERT( !closure_IND(p1) ); */ /* occurs in RaiseAsync.c:raiseAsync() */ /* See Note [Heap memory barriers] in SMP.h */ write_barrier(); - OVERWRITING_CLOSURE(p1); - IF_NONMOVING_WRITE_BARRIER_ENABLED { - updateRemembSetPushThunk(cap, (StgThunk*)p1); - } - ((StgInd *)p1)->indirectee = p2; - write_barrier(); - SET_INFO(p1, &stg_BLACKHOLE_info); - LDV_RECORD_CREATE(p1); - bd = Bdescr((StgPtr)p1); + bdescr *bd = Bdescr((StgPtr)p1); if (bd->gen_no != 0) { + IF_NONMOVING_WRITE_BARRIER_ENABLED { + updateRemembSetPushThunk(cap, (StgThunk*)p1); + } recordMutableCap(p1, cap, bd->gen_no); TICK_UPD_OLD_IND(); } else { TICK_UPD_NEW_IND(); } + OVERWRITING_CLOSURE(p1); + ((StgInd *)p1)->indirectee = p2; + write_barrier(); + SET_INFO(p1, &stg_BLACKHOLE_info); + LDV_RECORD_CREATE(p1); } #endif /* CMINUSMINUS */ |