Skip to content

Commit 1466e57

Browse files
committed
Refactoring reference processing to pass in the language.
1 parent 70055d5 commit 1466e57

File tree

4 files changed

+18
-13
lines changed

4 files changed

+18
-13
lines changed

src/main/java/org/truffleruby/RubyContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public RubyContext(RubyLanguage language, TruffleLanguage.Env env) {
189189
referenceProcessor = new ReferenceProcessor(this);
190190
finalizationService = new FinalizationService(referenceProcessor);
191191
markingService = new MarkingService(referenceProcessor);
192-
dataObjectFinalizationService = new DataObjectFinalizationService(referenceProcessor);
192+
dataObjectFinalizationService = new DataObjectFinalizationService(language, referenceProcessor);
193193

194194
// We need to construct this at runtime
195195
random = createRandomInstance();

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

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

1212
import java.lang.ref.ReferenceQueue;
13+
import java.util.concurrent.locks.ReentrantLock;
1314

1415
import org.truffleruby.RubyContext;
1516
import org.truffleruby.RubyLanguage;
1617
import org.truffleruby.cext.DataHolder;
1718
import org.truffleruby.core.MarkingService.ExtensionCallStack;
19+
import org.truffleruby.core.mutex.MutexOperations;
1820
import org.truffleruby.language.RubyBaseRootNode;
1921
import org.truffleruby.language.backtrace.InternalRootNode;
2022

23+
import com.oracle.truffle.api.CallTarget;
2124
import com.oracle.truffle.api.interop.ArityException;
2225
import com.oracle.truffle.api.interop.InteropLibrary;
2326
import com.oracle.truffle.api.interop.UnsupportedMessageException;
2427
import com.oracle.truffle.api.interop.UnsupportedTypeException;
28+
import com.oracle.truffle.api.profiles.ConditionProfile;
2529
import com.oracle.truffle.api.frame.VirtualFrame;
2630

2731
/** Finalizers are implemented with phantom references and reference queues, and are run in a dedicated Ruby thread. */
2832
public class DataObjectFinalizationService extends ReferenceProcessingService<DataObjectFinalizerReference> {
2933

30-
// We need a base node here, it shoudl extend ruby base root node and implement internal root node.
34+
// We need a base node here, it should extend ruby base root node and implement internal root node.
3135
public static class DataObjectFinalizerRootNode extends RubyBaseRootNode implements InternalRootNode {
3236

3337
@Child private InteropLibrary nullNode;
@@ -64,21 +68,21 @@ public Object execute(DataObjectFinalizerReference ref) {
6468

6569
private final DataObjectFinalizerRootNode rootNode;
6670

67-
public DataObjectFinalizationService(ReferenceQueue<Object> processingQueue) {
71+
public DataObjectFinalizationService(RubyLanguage language, ReferenceQueue<Object> processingQueue) {
6872
super(processingQueue);
69-
rootNode = new DataObjectFinalizerRootNode(RubyLanguage.getCurrentLanguage());
73+
rootNode = new DataObjectFinalizerRootNode(language);
7074
}
7175

72-
public DataObjectFinalizationService(ReferenceProcessor referenceProcessor) {
73-
this(referenceProcessor.processingQueue);
76+
public DataObjectFinalizationService(RubyLanguage language, ReferenceProcessor referenceProcessor) {
77+
this(language, referenceProcessor.processingQueue);
7478
}
7579

7680
public DataObjectFinalizerReference addFinalizer(RubyContext context, Object object, Object callable,
7781
DataHolder dataHolder) {
7882
final DataObjectFinalizerReference newRef = createRef(object, callable, dataHolder);
7983

8084
add(newRef);
81-
context.getReferenceProcessor().processReferenceQueue();
85+
context.getReferenceProcessor().processReferenceQueue(this);
8286

8387
return newRef;
8488
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public FinalizerReference addFinalizer(RubyContext context, Object object, Class
6464
newRef.addFinalizer(owner, action, root);
6565

6666
add(newRef);
67-
context.getReferenceProcessor().processReferenceQueue();
67+
context.getReferenceProcessor().processReferenceQueue(this);
6868

6969
return newRef;
7070
}
@@ -78,7 +78,7 @@ public void addAdditionalFinalizer(RubyContext context, FinalizerReference exist
7878
assert Thread.holdsLock(object) : "caller must synchronize access to the FinalizerReference";
7979
existingRef.addFinalizer(owner, action, root);
8080

81-
context.getReferenceProcessor().processReferenceQueue();
81+
context.getReferenceProcessor().processReferenceQueue(this);
8282
}
8383

8484
public final void drainFinalizationQueue(RubyContext context) {

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ public ReferenceProcessor(RubyContext context) {
147147
this.context = context;
148148
}
149149

150-
protected void processReferenceQueue() {
150+
protected void processReferenceQueue(ReferenceProcessingService<?> service) {
151151
if (processOnMainThread()) {
152152
drainReferenceQueues();
153153
} else {
@@ -159,7 +159,7 @@ protected void processReferenceQueue() {
159159
* assumption and a low risk of leaking a tiny number of bytes if it doesn't hold. */
160160
if (processingThread == null && !context.isPreInitializing() && context.isInitialized() &&
161161
!context.isFinalizing()) {
162-
createProcessingThread();
162+
createProcessingThread(service);
163163
}
164164
}
165165
}
@@ -171,7 +171,7 @@ public boolean processOnMainThread() {
171171
private static final String THREAD_NAME = "Ruby-reference-processor";
172172

173173
@TruffleBoundary
174-
protected void createProcessingThread() {
174+
protected void createProcessingThread(ReferenceProcessingService<?> service) {
175175
final ThreadManager threadManager = context.getThreadManager();
176176
final RubyLanguage language = context.getLanguageSlow();
177177
RubyThread newThread;
@@ -182,7 +182,8 @@ protected void createProcessingThread() {
182182
newThread = threadManager.createBootThread(THREAD_NAME);
183183
processingThread = newThread;
184184
}
185-
final String sharingReason = "creating " + THREAD_NAME + " thread";
185+
final String sharingReason = "creating " + THREAD_NAME + " thread for " +
186+
service.getClass().getSimpleName();
186187

187188
threadManager.initialize(newThread, DummyNode.INSTANCE, THREAD_NAME, sharingReason, () -> {
188189
while (true) {

0 commit comments

Comments
 (0)