mirror of
https://github.com/corda/corda.git
synced 2025-02-13 22:22:35 +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;
|
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;) {
|
for (object* f = &(m->finalizers); *f;) {
|
||||||
object o = finalizerTarget(t, *f);
|
object o = finalizerTarget(t, *f);
|
||||||
if (m->heap->follow(o) == o) {
|
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)) {
|
for (object* f = &(m->doomed); *f; f = &finalizerNext(t, *f)) {
|
||||||
v->visit(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) {
|
virtual unsigned sizeInWords(object o) {
|
||||||
@ -936,12 +931,6 @@ collect(Machine* m, Heap::CollectionType type)
|
|||||||
}
|
}
|
||||||
m->doomed = 0;
|
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;
|
m->weakReferences = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user