@@ -55,13 +55,13 @@ public DynamicObject getRoot() {
55
55
56
56
public static class FinalizerReference extends PhantomReference <Object > {
57
57
58
- private static FinalizerReference first = null ;
59
-
60
58
/**
61
59
* All accesses to this Deque must be synchronized by taking the
62
60
* {@link FinalizationService} monitor, to avoid concurrent access.
63
61
*/
64
62
private final Deque <Finalizer > finalizers = new LinkedList <>();
63
+
64
+ /** The doubly-linked list of FinalizerReference, needed to collect finalizer Procs for ObjectSpace. */
65
65
private FinalizerReference next = null ;
66
66
private FinalizerReference prev = null ;
67
67
@@ -73,10 +73,11 @@ private void addFinalizer(Class<?> owner, Runnable action, DynamicObject root) {
73
73
finalizers .addLast (new Finalizer (owner , action , root ));
74
74
}
75
75
76
- private FinalizerReference removeFinalizers (Class <?> owner ) {
76
+ private FinalizerReference removeFinalizers (FinalizationService finalizationService , Class <?> owner ) {
77
77
finalizers .removeIf (f -> f .getOwner () == owner );
78
+
78
79
if (finalizers .isEmpty ()) {
79
- remove (this );
80
+ finalizationService . remove (this );
80
81
return null ;
81
82
} else {
82
83
return this ;
@@ -99,7 +100,10 @@ private void collectRoots(Collection<DynamicObject> roots) {
99
100
100
101
private final RubyContext context ;
101
102
private final ReferenceQueue <Object > finalizerQueue = new ReferenceQueue <>();
103
+ /** The finalizer Ruby thread, spawned lazily. */
102
104
private DynamicObject finalizerThread ;
105
+ /** The head of a doubly-linked list of FinalizerReference, needed to collect finalizer Procs for ObjectSpace. */
106
+ private FinalizerReference first = null ;
103
107
104
108
public FinalizationService (RubyContext context ) {
105
109
this .context = context ;
@@ -109,7 +113,7 @@ public synchronized FinalizerReference addFinalizer(Object object, FinalizerRefe
109
113
110
114
if (finalizerReference == null ) {
111
115
finalizerReference = new FinalizerReference (object , finalizerQueue );
112
- FinalizationService . add (finalizerReference );
116
+ add (finalizerReference );
113
117
}
114
118
115
119
finalizerReference .addFinalizer (owner , action , root );
@@ -166,7 +170,7 @@ private void createFinalizationThread() {
166
170
}
167
171
168
172
private void runFinalizer (FinalizerReference finalizerReference ) {
169
- FinalizationService . remove (finalizerReference );
173
+ remove (finalizerReference );
170
174
171
175
try {
172
176
while (!context .isFinalizing ()) {
@@ -193,7 +197,7 @@ private void runFinalizer(FinalizerReference finalizerReference) {
193
197
}
194
198
195
199
public synchronized void collectRoots (Collection <DynamicObject > roots ) {
196
- FinalizerReference finalizerReference = FinalizerReference . first ;
200
+ FinalizerReference finalizerReference = first ;
197
201
while (finalizerReference != null ) {
198
202
finalizerReference .collectRoots (roots );
199
203
finalizerReference = finalizerReference .next ;
@@ -202,24 +206,24 @@ public synchronized void collectRoots(Collection<DynamicObject> roots) {
202
206
203
207
public synchronized FinalizerReference removeFinalizers (Object object , FinalizerReference ref , Class <?> owner ) {
204
208
if (ref != null ) {
205
- return ref .removeFinalizers (owner );
209
+ return ref .removeFinalizers (this , owner );
206
210
} else {
207
211
return null ;
208
212
}
209
213
}
210
214
211
- private static synchronized void remove (FinalizerReference ref ) {
215
+ private synchronized void remove (FinalizerReference ref ) {
212
216
if (ref .next == ref ) {
213
217
// Already removed.
214
218
return ;
215
219
}
216
220
217
- if (FinalizerReference . first == ref ) {
221
+ if (first == ref ) {
218
222
if (ref .next != null ) {
219
- FinalizerReference . first = ref .next ;
223
+ first = ref .next ;
220
224
} else {
221
225
// The list becomes empty
222
- FinalizerReference . first = null ;
226
+ first = null ;
223
227
}
224
228
}
225
229
@@ -235,12 +239,12 @@ private static synchronized void remove(FinalizerReference ref) {
235
239
ref .prev = ref ;
236
240
}
237
241
238
- private static synchronized void add (FinalizerReference newRef ) {
239
- if (FinalizerReference . first != null ) {
240
- newRef .next = FinalizerReference . first ;
241
- FinalizerReference . first .prev = newRef ;
242
+ private synchronized void add (FinalizerReference newRef ) {
243
+ if (first != null ) {
244
+ newRef .next = first ;
245
+ first .prev = newRef ;
242
246
}
243
- FinalizerReference . first = newRef ;
247
+ first = newRef ;
244
248
}
245
249
246
250
}
0 commit comments