Skip to content

Commit 04db6e1

Browse files
committed
Refactor ProcessingReferences to extract common code.
1 parent fcad842 commit 04db6e1

File tree

3 files changed

+79
-84
lines changed

3 files changed

+79
-84
lines changed

src/main/java/org/truffleruby/core/FinalizationService.java

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99
*/
1010
package org.truffleruby.core;
1111

12-
import java.lang.ref.PhantomReference;
1312
import java.lang.ref.ReferenceQueue;
1413
import java.util.Collection;
1514
import java.util.Deque;
1615
import java.util.LinkedList;
1716
import java.util.Set;
1817

1918
import org.truffleruby.RubyContext;
19+
import org.truffleruby.core.ReferenceProcessingService.PhantomProcessingReference;
2020

2121
import com.oracle.truffle.api.object.DynamicObject;
2222
import org.truffleruby.language.objects.ObjectGraphNode;
@@ -52,38 +52,16 @@ public DynamicObject getRoot() {
5252
}
5353
}
5454

55-
public static class FinalizerReference extends PhantomReference<Object> implements ReferenceProcessingService.ProcessingReference<FinalizerReference>, ObjectGraphNode {
55+
public static class FinalizerReference extends PhantomProcessingReference<FinalizerReference, Object> implements ObjectGraphNode {
5656

5757
/**
5858
* All accesses to this Deque must be synchronized by taking the
5959
* {@link FinalizationService} monitor, to avoid concurrent access.
6060
*/
6161
private final Deque<Finalizer> finalizers = new LinkedList<>();
62-
private final FinalizationService service;
63-
64-
/** The doubly-linked list of FinalizerReference, needed to collect finalizer Procs for ObjectSpace. */
65-
FinalizerReference next = null;
66-
FinalizerReference prev = null;
6762

6863
private FinalizerReference(Object object, ReferenceQueue<? super Object> queue, FinalizationService service) {
69-
super(object, queue);
70-
this.service = service;
71-
}
72-
73-
public FinalizerReference getPrevious() {
74-
return prev;
75-
}
76-
77-
public void setPrevious(FinalizerReference previous) {
78-
prev = previous;
79-
}
80-
81-
public FinalizerReference getNext() {
82-
return next;
83-
}
84-
85-
public void setNext(FinalizerReference next) {
86-
this.next = next;
64+
super(object, queue, service);
8765
}
8866

8967
private void addFinalizer(Class<?> owner, Runnable action, DynamicObject root) {
@@ -114,10 +92,6 @@ private void collectRoots(Collection<DynamicObject> roots) {
11492
}
11593
}
11694

117-
public ReferenceProcessingService<FinalizerReference> service() {
118-
return service;
119-
}
120-
12195
@Override
12296
public void getAdjacentObjects(Set<DynamicObject> reachable) {
12397
collectRoots(reachable);
@@ -171,7 +145,7 @@ public synchronized void collectRoots(Collection<DynamicObject> roots) {
171145
FinalizerReference finalizerReference = getFirst();
172146
while (finalizerReference != null) {
173147
finalizerReference.collectRoots(roots);
174-
finalizerReference = finalizerReference.next;
148+
finalizerReference = finalizerReference.getNext();
175149
}
176150
}
177151

src/main/java/org/truffleruby/core/MarkingService.java

Lines changed: 5 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@
1010
package org.truffleruby.core;
1111

1212
import java.lang.ref.ReferenceQueue;
13-
import java.lang.ref.WeakReference;
1413
import java.util.ArrayList;
1514

1615
import org.truffleruby.RubyContext;
16+
import org.truffleruby.core.ReferenceProcessingService.WeakProcessingReference;
1717
import org.truffleruby.core.queue.UnsizedQueue;
1818

1919
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
@@ -45,69 +45,20 @@ public static interface MarkerAction {
4545
public abstract void mark(DynamicObject owner);
4646
}
4747

48-
public static class MarkerReference extends WeakReference<DynamicObject> implements ReferenceProcessingService.ProcessingReference<MarkerReference> {
48+
public static class MarkerReference extends WeakProcessingReference<MarkerReference, DynamicObject> {
4949

5050
private final MarkerAction action;
51-
private final MarkingService service;
52-
private MarkerReference next = null;
53-
private MarkerReference prev = null;
5451

5552
private MarkerReference(DynamicObject object, ReferenceQueue<? super Object> queue, MarkerAction action, MarkingService service) {
56-
super(object, queue);
53+
super(object, queue, service);
5754
this.action = action;
58-
this.service = service;
59-
}
60-
61-
public MarkerReference getPrevious() {
62-
return prev;
63-
}
64-
65-
public void setPrevious(MarkerReference previous) {
66-
prev = previous;
67-
}
68-
69-
public MarkerReference getNext() {
70-
return next;
71-
}
72-
73-
public void setNext(MarkerReference next) {
74-
this.next = next;
75-
}
76-
77-
public ReferenceProcessingService<MarkerReference> service() {
78-
return service;
7955
}
8056
}
8157

82-
public static class MarkRunnerReference extends WeakReference<Object> implements ReferenceProcessingService.ProcessingReference<MarkRunnerReference> {
83-
84-
private final MarkRunnerService service;
85-
private MarkRunnerReference next = null;
86-
private MarkRunnerReference prev = null;
58+
public static class MarkRunnerReference extends WeakProcessingReference<MarkRunnerReference, Object> {
8759

8860
public MarkRunnerReference(Object object, ReferenceQueue<? super Object> queue, MarkRunnerService service) {
89-
super(object, queue);
90-
this.service = service;
91-
}
92-
93-
public MarkRunnerReference getPrevious() {
94-
return prev;
95-
}
96-
97-
public void setPrevious(MarkRunnerReference previous) {
98-
prev = previous;
99-
}
100-
101-
public MarkRunnerReference getNext() {
102-
return next;
103-
}
104-
105-
public void setNext(MarkRunnerReference next) {
106-
this.next = next;
107-
}
108-
109-
public ReferenceProcessingService<MarkRunnerReference> service() {
110-
return service;
61+
super(object, queue, service);
11162
}
11263
}
11364

src/main/java/org/truffleruby/core/ReferenceProcessingService.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
*/
1010
package org.truffleruby.core;
1111

12+
import java.lang.ref.PhantomReference;
1213
import java.lang.ref.ReferenceQueue;
14+
import java.lang.ref.WeakReference;
1315
import java.util.function.Consumer;
1416

1517
import org.truffleruby.RubyContext;
@@ -33,6 +35,74 @@ public static interface ProcessingReference<R extends ProcessingReference<R>> {
3335
public ReferenceProcessingService<R> service();
3436
}
3537

38+
public abstract static class WeakProcessingReference<R extends ProcessingReference<R>, T> extends WeakReference<T> implements ProcessingReference<R> {
39+
40+
private R next;
41+
private R previous;
42+
private ReferenceProcessingService<R> service;
43+
44+
public WeakProcessingReference(T object, ReferenceQueue<? super Object> queue, ReferenceProcessingService<R> service) {
45+
super(object, queue);
46+
this.service = service;
47+
}
48+
49+
public R getPrevious() {
50+
return previous;
51+
}
52+
53+
public void setPrevious(R previous) {
54+
this.previous = previous;
55+
}
56+
57+
public R getNext() {
58+
return next;
59+
}
60+
61+
public void setNext(R next) {
62+
this.next = next;
63+
}
64+
65+
public ReferenceProcessingService<R> service() {
66+
return service;
67+
}
68+
}
69+
70+
public abstract static class PhantomProcessingReference<R extends ProcessingReference<R>, T> extends PhantomReference<T> implements ProcessingReference<R> {
71+
72+
/**
73+
* Doubly linked list of references to keep to allow the reference service to traverse them
74+
* and to keep the references alive for processing.
75+
*/
76+
private R next;
77+
private R previous;
78+
private ReferenceProcessingService<R> service;
79+
80+
public PhantomProcessingReference(T object, ReferenceQueue<? super Object> queue, ReferenceProcessingService<R> service) {
81+
super(object, queue);
82+
this.service = service;
83+
}
84+
85+
public R getPrevious() {
86+
return previous;
87+
}
88+
89+
public void setPrevious(R previous) {
90+
this.previous = previous;
91+
}
92+
93+
public R getNext() {
94+
return next;
95+
}
96+
97+
public void setNext(R next) {
98+
this.next = next;
99+
}
100+
101+
public ReferenceProcessingService<R> service() {
102+
return service;
103+
}
104+
}
105+
36106
public static class ReferenceProcessor {
37107
protected final ReferenceQueue<Object> processingQueue = new ReferenceQueue<>();
38108

0 commit comments

Comments
 (0)