summaryrefslogtreecommitdiff
path: root/rts/sm/Storage.c
diff options
context:
space:
mode:
authorÖmer Sinan Ağacan <omeragacan@gmail.com>2019-02-22 10:44:27 +0300
committerBen Gamari <ben@smart-cactus.org>2019-02-22 11:38:57 -0500
commit6698bbadb99695e97f0f07b36f57dd06193074ae (patch)
tree41f75effa2f1802a60cc8364d50d2bd4b46d8aba /rts/sm/Storage.c
parenta4f7fc5e8a3002f19b78d7982735a2d42dd744b1 (diff)
downloadhaskell-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.c18
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);
}
}