Skip to content

Commit 2d1f4ea

Browse files
committed
Small cleanup in FinalizationService
* Clarify what happens when removing the last FinalizerReference.
1 parent 82b3f94 commit 2d1f4ea

File tree

2 files changed

+11
-15
lines changed

2 files changed

+11
-15
lines changed

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

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ public DynamicObject getRoot() {
5555

5656
public static class FinalizerReference extends PhantomReference<Object> {
5757

58+
private static FinalizerReference first = null;
59+
5860
/**
5961
* All accesses to this Deque must be synchronized by taking the
6062
* {@link FinalizationService} monitor, to avoid concurrent access.
@@ -63,8 +65,6 @@ public static class FinalizerReference extends PhantomReference<Object> {
6365
private FinalizerReference next = null;
6466
private FinalizerReference prev = null;
6567

66-
private static FinalizerReference first = null;
67-
6868
private FinalizerReference(Object object, ReferenceQueue<? super Object> queue) {
6969
super(object, queue);
7070
}
@@ -98,19 +98,13 @@ private void collectRoots(Collection<DynamicObject> roots) {
9898
}
9999

100100
private final RubyContext context;
101-
102101
private final ReferenceQueue<Object> finalizerQueue = new ReferenceQueue<>();
103-
104102
private DynamicObject finalizerThread;
105103

106104
public FinalizationService(RubyContext context) {
107105
this.context = context;
108106
}
109107

110-
public FinalizerReference addFinalizer(Object object, FinalizerReference ref, Class<?> owner, Runnable action) {
111-
return addFinalizer(object, ref, owner, action, null);
112-
}
113-
114108
public synchronized FinalizerReference addFinalizer(Object object, FinalizerReference finalizerReference, Class<?> owner, Runnable action, DynamicObject root) {
115109

116110
if (finalizerReference == null) {
@@ -163,17 +157,18 @@ private void createFinalizationThread() {
163157

164158
threadManager.initialize(finalizerThread, null, "finalizer", () -> {
165159
while (true) {
166-
final FinalizerReference finalizerReference = (FinalizerReference) threadManager.runUntilResult(null,
167-
finalizerQueue::remove);
160+
final FinalizerReference finalizerReference =
161+
(FinalizerReference) threadManager.runUntilResult(null, finalizerQueue::remove);
168162

169163
runFinalizer(finalizerReference);
170164
}
171165
});
172166
}
173167

174168
private void runFinalizer(FinalizerReference finalizerReference) {
169+
FinalizationService.remove(finalizerReference);
170+
175171
try {
176-
FinalizationService.remove(finalizerReference);
177172
while (!context.isFinalizing()) {
178173
final Finalizer finalizer;
179174
synchronized (this) {
@@ -213,7 +208,7 @@ public synchronized FinalizerReference removeFinalizers(Object object, Finalizer
213208
}
214209
}
215210

216-
static synchronized void remove(FinalizerReference ref) {
211+
private static synchronized void remove(FinalizerReference ref) {
217212
if (ref.next == ref) {
218213
// Already removed.
219214
return;
@@ -223,7 +218,8 @@ static synchronized void remove(FinalizerReference ref) {
223218
if (ref.next != null) {
224219
FinalizerReference.first = ref.next;
225220
} else {
226-
FinalizerReference.first = ref.prev;
221+
// The list becomes empty
222+
FinalizerReference.first = null;
227223
}
228224
}
229225

@@ -239,7 +235,7 @@ static synchronized void remove(FinalizerReference ref) {
239235
ref.prev = ref;
240236
}
241237

242-
static synchronized void add(FinalizerReference newRef) {
238+
private static synchronized void add(FinalizerReference newRef) {
243239
if (FinalizerReference.first != null) {
244240
newRef.next = FinalizerReference.first;
245241
FinalizerReference.first.prev = newRef;

src/main/java/org/truffleruby/extra/ffi/Pointer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ public synchronized void enableAutorelease(FinalizationService finalizationServi
248248

249249
// We must be careful here that the finalizer does not capture the Pointer itself that we'd
250250
// like to finalize.
251-
finalizerRef = finalizationService.addFinalizer(this, finalizerRef, Pointer.class, new FreeAddressFinalizer(address));
251+
finalizerRef = finalizationService.addFinalizer(this, finalizerRef, Pointer.class, new FreeAddressFinalizer(address), null);
252252

253253
autorelease = true;
254254
}

0 commit comments

Comments
 (0)