diff options
author | Simon Marlow <simonmarhaskell@gmail.com> | 2008-04-16 23:39:51 +0000 |
---|---|---|
committer | Simon Marlow <simonmarhaskell@gmail.com> | 2008-04-16 23:39:51 +0000 |
commit | 04cddd339c000df6d02c90ce59dbffa58d2fe166 (patch) | |
tree | 4ba138d182f71f2751daeb3cb77c0fc86cf1110f /rts/sm/MarkWeak.c | |
parent | 9de1ad504a0a12dabd42b206f06ca04fa0e7009a (diff) | |
download | haskell-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.c | 10 |
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; } } |