mirror of
https://github.com/corda/corda.git
synced 2025-02-05 02:29:20 +00:00
Revert "fix ordering of weak reference and finalization processing"
This reverts commit 0a32a7b7af8bf75315a1e729843f295954c2ebec. Actually, I had it right the first time, somewhat by accident.
This commit is contained in:
parent
0a32a7b7af
commit
1182ea9540
41
src/vm.cpp
41
src/vm.cpp
@ -763,26 +763,6 @@ collect(Machine* m, Heap::CollectionType type)
|
||||
}
|
||||
|
||||
Thread* t = m->rootThread;
|
||||
|
||||
object p = m->weakReferences;
|
||||
m->weakReferences = 0;
|
||||
while (p) {
|
||||
object o = jreferenceTarget(t, p);
|
||||
object followed = m->heap->follow(o);
|
||||
if (followed == o) {
|
||||
// object has not been collected
|
||||
object x = p;
|
||||
p = weakReferenceNext(t, x);
|
||||
weakReferenceNext(t, x) = m->weakReferences;
|
||||
m->weakReferences = x;
|
||||
} else {
|
||||
jreferenceTarget(t, p) = followed;
|
||||
object x = p;
|
||||
p = weakReferenceNext(t, x);
|
||||
weakReferenceNext(t, x) = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (object* f = &(m->finalizers); *f;) {
|
||||
object o = finalizerTarget(t, *f);
|
||||
if (m->heap->follow(o) == o) {
|
||||
@ -803,6 +783,21 @@ collect(Machine* m, Heap::CollectionType type)
|
||||
for (object* f = &(m->doomed); *f; f = &finalizerNext(t, *f)) {
|
||||
v->visit(f);
|
||||
}
|
||||
|
||||
for (object p = m->weakReferences; p;) {
|
||||
object o = jreferenceTarget(t, p);
|
||||
object followed = m->heap->follow(o);
|
||||
if (followed == o) {
|
||||
// object has not been collected
|
||||
jreferenceTarget(t, p) = 0;
|
||||
} else {
|
||||
jreferenceTarget(t, p) = followed;
|
||||
}
|
||||
|
||||
object last = p;
|
||||
p = weakReferenceNext(t, p);
|
||||
weakReferenceNext(t, last) = 0;
|
||||
}
|
||||
}
|
||||
|
||||
virtual unsigned sizeInWords(object o) {
|
||||
@ -936,12 +931,6 @@ collect(Machine* m, Heap::CollectionType type)
|
||||
}
|
||||
m->doomed = 0;
|
||||
|
||||
for (object p = m->weakReferences; p;) {
|
||||
jreferenceTarget(t, p) = 0;
|
||||
object x = p;
|
||||
p = weakReferenceNext(t, x);
|
||||
weakReferenceNext(t, x) = 0;
|
||||
}
|
||||
m->weakReferences = 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user