Skip to content

Commit b0f806e

Browse files
committed
Finalizer should be shared eagerly
1 parent 23fe325 commit b0f806e

File tree

2 files changed

+8
-2
lines changed

2 files changed

+8
-2
lines changed

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ public FinalizationService(RubyContext context, ReferenceProcessor referenceProc
104104
}
105105

106106
public synchronized FinalizerReference addFinalizer(Object object, FinalizerReference finalizerReference, Class<?> owner, Runnable action, DynamicObject root) {
107-
108107
if (finalizerReference == null) {
109108
finalizerReference = new FinalizerReference(object, referenceProcessor.processingQueue, this);
110109
add(finalizerReference);

src/main/java/org/truffleruby/core/objectspace/ObjectSpaceNodes.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.truffleruby.language.objects.ReadObjectFieldNodeGen;
3636
import org.truffleruby.language.objects.WriteObjectFieldNode;
3737
import org.truffleruby.language.objects.WriteObjectFieldNodeGen;
38+
import org.truffleruby.language.objects.shared.WriteBarrierNode;
3839

3940
@CoreClass("ObjectSpace")
4041
public abstract class ObjectSpaceNodes {
@@ -175,8 +176,14 @@ public abstract static class DefineFinalizerNode extends CoreMethodArrayArgument
175176

176177
@Specialization
177178
public DynamicObject defineFinalizer(VirtualFrame frame, DynamicObject object, Object finalizer,
178-
@Cached("create()") BranchProfile errorProfile) {
179+
@Cached("create()") BranchProfile errorProfile,
180+
@Cached("create()") WriteBarrierNode writeBarrierNode) {
179181
if (respondToCallNode.doesRespondTo(frame, "call", finalizer)) {
182+
if (getContext().getSharedObjects().isSharing()) {
183+
// Share the finalizer, as it might run on a different Thread
184+
writeBarrierNode.executeWriteBarrier(finalizer);
185+
}
186+
180187
defineFinalizer(object, finalizer);
181188
Object[] objects = new Object[] { 0, finalizer };
182189
return createArray(objects, objects.length);

0 commit comments

Comments
 (0)