Skip to content

Commit ddf5983

Browse files
committed
Refactor to avoid storing RubyLangauge in reference processor.
1 parent 517f945 commit ddf5983

File tree

3 files changed

+29
-23
lines changed

3 files changed

+29
-23
lines changed

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,14 +86,16 @@ public final void drainFinalizationQueue(RubyContext context) {
8686
}
8787

8888
@Override
89-
protected void processReference(RubyContext context, ProcessingReference<?> finalizerReference) {
90-
super.processReference(context, finalizerReference);
89+
protected void processReference(RubyContext context, RubyLanguage language,
90+
ProcessingReference<?> finalizerReference) {
91+
super.processReference(context, language, finalizerReference);
9192

92-
runCatchingErrors(context, this::processReferenceInternal, (FinalizerReference) finalizerReference);
93+
runCatchingErrors(context, language, this::processReferenceInternal, (FinalizerReference) finalizerReference);
9394
}
9495

95-
protected void processReferenceInternal(RubyContext context, FinalizerReference finalizerReference) {
96-
ExtensionCallStack stack = language.getCurrentThread().getCurrentFiber().extensionCallStack;
96+
protected void processReferenceInternal(RubyContext context, RubyLanguage language,
97+
FinalizerReference finalizerReference) {
98+
final ExtensionCallStack stack = language.getCurrentThread().getCurrentFiber().extensionCallStack;
9799
stack.push(stack.getVariables(), stack.getBlock());
98100
try {
99101
while (!context.isFinalizing()) {

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,10 @@ public MarkRunnerService(
6565
}
6666

6767
@Override
68-
protected void processReference(RubyContext context, ProcessingReference<?> reference) {
68+
protected void processReference(RubyContext context, RubyLanguage language, ProcessingReference<?> reference) {
6969
/* We need to keep all the objects that might be marked alive during the marking process itself, so we add
7070
* the arrays to a list to achieve this. */
71-
super.processReference(context, reference);
71+
super.processReference(context, language, reference);
7272
ArrayList<ValueWrapperManager.HandleBlock> keptObjectLists = new ArrayList<>();
7373
ValueWrapperManager.HandleBlock block;
7474
while (true) {
@@ -80,14 +80,14 @@ protected void processReference(RubyContext context, ProcessingReference<?> refe
8080
}
8181
}
8282
if (!keptObjectLists.isEmpty()) {
83-
runAllMarkers(context);
83+
runAllMarkers(context, language);
8484
}
8585
keptObjectLists.clear();
8686
}
8787

8888
@TruffleBoundary
89-
public void runAllMarkers(RubyContext context) {
90-
ExtensionCallStack stack = markingService.language.getCurrentThread().getCurrentFiber().extensionCallStack;
89+
public void runAllMarkers(RubyContext context, RubyLanguage language) {
90+
final ExtensionCallStack stack = language.getCurrentThread().getCurrentFiber().extensionCallStack;
9191
stack.push(stack.getVariables(), stack.getBlock());
9292
try {
9393
// TODO (eregon, 15 Sept 2020): there seems to be no synchronization here while walking the list of
@@ -96,7 +96,7 @@ public void runAllMarkers(RubyContext context) {
9696
MarkerReference nextMarker;
9797
while (currentMarker != null) {
9898
nextMarker = currentMarker.getNext();
99-
markingService.runMarker(context, currentMarker);
99+
markingService.runMarker(context, language, currentMarker);
100100
if (nextMarker == currentMarker) {
101101
throw new Error("The MarkerReference linked list structure has become broken.");
102102
}
@@ -184,11 +184,11 @@ public void addMarker(Object object, MarkerAction action) {
184184
add(new MarkerReference(object, processingQueue, action, this));
185185
}
186186

187-
private void runMarker(RubyContext context, MarkerReference markerReference) {
188-
runCatchingErrors(context, this::runMarkerInternal, markerReference);
187+
private void runMarker(RubyContext context, RubyLanguage language, MarkerReference markerReference) {
188+
runCatchingErrors(context, language, this::runMarkerInternal, markerReference);
189189
}
190190

191-
private void runMarkerInternal(RubyContext context, MarkerReference markerReference) {
191+
private void runMarkerInternal(RubyContext context, RubyLanguage language, MarkerReference markerReference) {
192192
if (!context.isFinalizing()) {
193193
Object owner = markerReference.get();
194194
if (owner != null) {

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
import java.lang.ref.PhantomReference;
1313
import java.lang.ref.ReferenceQueue;
1414
import java.lang.ref.WeakReference;
15-
import java.util.function.BiConsumer;
1615

1716
import com.oracle.truffle.api.CompilerDirectives;
1817
import org.truffleruby.RubyContext;
@@ -172,6 +171,7 @@ protected void processReferenceQueue(Class<?> owner) {
172171

173172
protected void createProcessingThread(Class<?> owner) {
174173
final ThreadManager threadManager = context.getThreadManager();
174+
final RubyLanguage language = context.getLanguageSlow();
175175
RubyThread newThread;
176176
synchronized (this) {
177177
if (processingThread != null) {
@@ -205,7 +205,7 @@ protected void createProcessingThread(Class<?> owner) {
205205
}
206206
return ref;
207207
});
208-
reference.service().processReference(context, reference);
208+
reference.service().processReference(context, language, reference);
209209
}
210210
});
211211
}
@@ -228,7 +228,8 @@ public RubyThread getProcessingThread() {
228228
}
229229

230230
protected final void drainReferenceQueues() {
231-
ReferenceQueue<Object> sharedReferenceQueue = context.getLanguageSlow().sharedReferenceQueue;
231+
final ReferenceQueue<Object> sharedReferenceQueue = context.getLanguageSlow().sharedReferenceQueue;
232+
final RubyLanguage language = context.getLanguageSlow();
232233
while (true) {
233234
@SuppressWarnings("unchecked")
234235
ProcessingReference<?> reference = (ProcessingReference<?>) processingQueue.poll();
@@ -241,7 +242,7 @@ protected final void drainReferenceQueues() {
241242
break;
242243
}
243244

244-
reference.service().processReference(context, reference);
245+
reference.service().processReference(context, language, reference);
245246
}
246247
}
247248

@@ -251,21 +252,24 @@ protected final void drainReferenceQueues() {
251252
private R first = null;
252253

253254
protected final ReferenceQueue<Object> processingQueue;
254-
protected final RubyLanguage language;
255255

256256
public ReferenceProcessingService(RubyLanguage language, ReferenceQueue<Object> processingQueue) {
257-
this.language = language;
258257
this.processingQueue = processingQueue;
259258
}
260259

261260
@SuppressWarnings("unchecked")
262-
protected void processReference(RubyContext context, ProcessingReference<?> reference) {
261+
protected void processReference(RubyContext context, RubyLanguage language, ProcessingReference<?> reference) {
263262
remove((R) reference);
264263
}
265264

266-
protected void runCatchingErrors(RubyContext context, BiConsumer<RubyContext, R> action, R reference) {
265+
public interface ReferenceRunner<T, U, V> {
266+
public void accept(T t, U u, V v);
267+
}
268+
269+
protected void runCatchingErrors(RubyContext context, RubyLanguage language,
270+
ReferenceRunner<RubyContext, RubyLanguage, R> action, R reference) {
267271
try {
268-
action.accept(context, reference);
272+
action.accept(context, language, reference);
269273
} catch (TerminationException e) {
270274
throw e;
271275
} catch (RaiseException e) {

0 commit comments

Comments
 (0)