diff options
author | Ömer Sinan Ağacan <omeragacan@gmail.com> | 2019-02-22 10:44:27 +0300 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2019-02-22 11:38:57 -0500 |
commit | 6698bbadb99695e97f0f07b36f57dd06193074ae (patch) | |
tree | 41f75effa2f1802a60cc8364d50d2bd4b46d8aba /rts/sm/Storage.c | |
parent | a4f7fc5e8a3002f19b78d7982735a2d42dd744b1 (diff) | |
download | haskell-wip/nonmoving-gc.tar.gz |
Remove origin arguments from write barrier functionswip/nonmoving-gc
Write barriers push old values of updated field, e.g. when we have
*q = p;
we do
updateRemembSetPushClosure(*q, q);
*q = p;
Here the second argument ("origin") is not useful because by the time we
do the update we invalidate "origin" (`q` is no longer origin of old
`*q`).
In general it doesn't make sense to record origins in write barriers so
we remove all origin arguments from write barriers.
Fixes #170.
Diffstat (limited to 'rts/sm/Storage.c')
-rw-r--r-- | rts/sm/Storage.c | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/rts/sm/Storage.c b/rts/sm/Storage.c index dd253ade57..6fa6d777a8 100644 --- a/rts/sm/Storage.c +++ b/rts/sm/Storage.c @@ -433,7 +433,7 @@ lockCAF (StgRegTable *reg, StgIndStatic *caf) if (nonmoving_write_barrier_enabled) { StgThunkInfoTable *thunk_info = itbl_to_thunk_itbl(orig_info_tbl); if (thunk_info->i.srt) { - updateRemembSetPushClosure(cap, GET_SRT(thunk_info), NULL); + updateRemembSetPushClosure(cap, GET_SRT(thunk_info)); } } @@ -1141,9 +1141,7 @@ dirty_MUT_VAR(StgRegTable *reg, StgMutVar *mvar, StgClosure *old) mvar->header.info = &stg_MUT_VAR_DIRTY_info; recordClosureMutated(cap, (StgClosure *) mvar); if (nonmoving_write_barrier_enabled != 0) { - updateRemembSetPushClosure_(reg, - old, - &mvar->var); + updateRemembSetPushClosure_(reg, old); } } } @@ -1162,7 +1160,7 @@ dirty_TVAR(Capability *cap, StgTVar *p, p->header.info = &stg_TVAR_DIRTY_info; recordClosureMutated(cap,(StgClosure*)p); if (nonmoving_write_barrier_enabled != 0) { - updateRemembSetPushClosure(cap, old, NULL); + updateRemembSetPushClosure(cap, old); } } } @@ -1179,7 +1177,7 @@ setTSOLink (Capability *cap, StgTSO *tso, StgTSO *target) tso->dirty = 1; recordClosureMutated(cap,(StgClosure*)tso); if (nonmoving_write_barrier_enabled) - updateRemembSetPushClosure(cap, (StgClosure *) tso->_link, NULL); + updateRemembSetPushClosure(cap, (StgClosure *) tso->_link); } tso->_link = target; } @@ -1191,7 +1189,7 @@ setTSOPrev (Capability *cap, StgTSO *tso, StgTSO *target) tso->dirty = 1; recordClosureMutated(cap,(StgClosure*)tso); if (nonmoving_write_barrier_enabled) - updateRemembSetPushClosure(cap, (StgClosure *) tso->block_info.prev, NULL); + updateRemembSetPushClosure(cap, (StgClosure *) tso->block_info.prev); } tso->block_info.prev = target; } @@ -1240,9 +1238,9 @@ update_MVAR(StgRegTable *reg, StgClosure *p, StgClosure *old_val) Capability *cap = regTableToCapability(reg); if (nonmoving_write_barrier_enabled) { StgMVar *mvar = (StgMVar *) p; - updateRemembSetPushClosure(cap, old_val, NULL); - updateRemembSetPushClosure(cap, (StgClosure *) mvar->head, NULL); - updateRemembSetPushClosure(cap, (StgClosure *) mvar->tail, NULL); + updateRemembSetPushClosure(cap, old_val); + updateRemembSetPushClosure(cap, (StgClosure *) mvar->head); + updateRemembSetPushClosure(cap, (StgClosure *) mvar->tail); } } |