@@ -55,6 +55,8 @@ public DynamicObject getRoot() {
55
55
56
56
public static class FinalizerReference extends PhantomReference <Object > {
57
57
58
+ private static FinalizerReference first = null ;
59
+
58
60
/**
59
61
* All accesses to this Deque must be synchronized by taking the
60
62
* {@link FinalizationService} monitor, to avoid concurrent access.
@@ -63,8 +65,6 @@ public static class FinalizerReference extends PhantomReference<Object> {
63
65
private FinalizerReference next = null ;
64
66
private FinalizerReference prev = null ;
65
67
66
- private static FinalizerReference first = null ;
67
-
68
68
private FinalizerReference (Object object , ReferenceQueue <? super Object > queue ) {
69
69
super (object , queue );
70
70
}
@@ -98,19 +98,13 @@ private void collectRoots(Collection<DynamicObject> roots) {
98
98
}
99
99
100
100
private final RubyContext context ;
101
-
102
101
private final ReferenceQueue <Object > finalizerQueue = new ReferenceQueue <>();
103
-
104
102
private DynamicObject finalizerThread ;
105
103
106
104
public FinalizationService (RubyContext context ) {
107
105
this .context = context ;
108
106
}
109
107
110
- public FinalizerReference addFinalizer (Object object , FinalizerReference ref , Class <?> owner , Runnable action ) {
111
- return addFinalizer (object , ref , owner , action , null );
112
- }
113
-
114
108
public synchronized FinalizerReference addFinalizer (Object object , FinalizerReference finalizerReference , Class <?> owner , Runnable action , DynamicObject root ) {
115
109
116
110
if (finalizerReference == null ) {
@@ -163,17 +157,18 @@ private void createFinalizationThread() {
163
157
164
158
threadManager .initialize (finalizerThread , null , "finalizer" , () -> {
165
159
while (true ) {
166
- final FinalizerReference finalizerReference = ( FinalizerReference ) threadManager . runUntilResult ( null ,
167
- finalizerQueue ::remove );
160
+ final FinalizerReference finalizerReference =
161
+ ( FinalizerReference ) threadManager . runUntilResult ( null , finalizerQueue ::remove );
168
162
169
163
runFinalizer (finalizerReference );
170
164
}
171
165
});
172
166
}
173
167
174
168
private void runFinalizer (FinalizerReference finalizerReference ) {
169
+ FinalizationService .remove (finalizerReference );
170
+
175
171
try {
176
- FinalizationService .remove (finalizerReference );
177
172
while (!context .isFinalizing ()) {
178
173
final Finalizer finalizer ;
179
174
synchronized (this ) {
@@ -213,7 +208,7 @@ public synchronized FinalizerReference removeFinalizers(Object object, Finalizer
213
208
}
214
209
}
215
210
216
- static synchronized void remove (FinalizerReference ref ) {
211
+ private static synchronized void remove (FinalizerReference ref ) {
217
212
if (ref .next == ref ) {
218
213
// Already removed.
219
214
return ;
@@ -223,7 +218,8 @@ static synchronized void remove(FinalizerReference ref) {
223
218
if (ref .next != null ) {
224
219
FinalizerReference .first = ref .next ;
225
220
} else {
226
- FinalizerReference .first = ref .prev ;
221
+ // The list becomes empty
222
+ FinalizerReference .first = null ;
227
223
}
228
224
}
229
225
@@ -239,7 +235,7 @@ static synchronized void remove(FinalizerReference ref) {
239
235
ref .prev = ref ;
240
236
}
241
237
242
- static synchronized void add (FinalizerReference newRef ) {
238
+ private static synchronized void add (FinalizerReference newRef ) {
243
239
if (FinalizerReference .first != null ) {
244
240
newRef .next = FinalizerReference .first ;
245
241
FinalizerReference .first .prev = newRef ;
0 commit comments