summaryrefslogtreecommitdiff
path: root/rts/sm/MarkWeak.c
diff options
context:
space:
mode:
authorSimon Marlow <simonmarhaskell@gmail.com>2008-04-16 23:39:51 +0000
committerSimon Marlow <simonmarhaskell@gmail.com>2008-04-16 23:39:51 +0000
commit04cddd339c000df6d02c90ce59dbffa58d2fe166 (patch)
tree4ba138d182f71f2751daeb3cb77c0fc86cf1110f /rts/sm/MarkWeak.c
parent9de1ad504a0a12dabd42b206f06ca04fa0e7009a (diff)
downloadhaskell-04cddd339c000df6d02c90ce59dbffa58d2fe166.tar.gz
Add a write barrier to the TSO link field (#1589)
Diffstat (limited to 'rts/sm/MarkWeak.c')
-rw-r--r--rts/sm/MarkWeak.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/rts/sm/MarkWeak.c b/rts/sm/MarkWeak.c
index 3faaf0edfe..9d47cdedeb 100644
--- a/rts/sm/MarkWeak.c
+++ b/rts/sm/MarkWeak.c
@@ -200,7 +200,7 @@ traverseWeakPtrList(void)
ASSERT(get_itbl(t)->type == TSO);
switch (t->what_next) {
case ThreadRelocated:
- next = t->link;
+ next = t->_link;
*prev = next;
continue;
case ThreadKilled:
@@ -258,7 +258,7 @@ traverseWeakPtrList(void)
*/
{
StgTSO **pt;
- for (pt = &blackhole_queue; *pt != END_TSO_QUEUE; pt = &((*pt)->link)) {
+ for (pt = &blackhole_queue; *pt != END_TSO_QUEUE; pt = &((*pt)->_link)) {
*pt = (StgTSO *)isAlive((StgClosure *)*pt);
ASSERT(*pt != NULL);
}
@@ -291,7 +291,7 @@ traverseBlackholeQueue (void)
flag = rtsFalse;
prev = NULL;
- for (t = blackhole_queue; t != END_TSO_QUEUE; prev=t, t = t->link) {
+ for (t = blackhole_queue; t != END_TSO_QUEUE; prev=t, t = t->_link) {
// if the thread is not yet alive...
if (! (tmp = (StgTSO *)isAlive((StgClosure*)t))) {
// if the closure it is blocked on is either (a) a
@@ -305,7 +305,9 @@ traverseBlackholeQueue (void)
}
tmp = t;
evacuate((StgClosure **)&tmp);
- if (prev) prev->link = t;
+ if (prev) prev->_link = t;
+ // no write barrier when on the blackhole queue,
+ // because we traverse the whole queue on every GC.
flag = rtsTrue;
}
}