Skip to content

Commit fcad842

Browse files
committed
Changes based on review.
1 parent d202706 commit fcad842

File tree

1 file changed

+12
-39
lines changed

1 file changed

+12
-39
lines changed

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

Lines changed: 12 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
import java.lang.ref.ReferenceQueue;
1313
import java.lang.ref.WeakReference;
14-
import java.util.ArrayDeque;
1514
import java.util.ArrayList;
1615

1716
import org.truffleruby.RubyContext;
@@ -112,6 +111,12 @@ public ReferenceProcessingService<MarkRunnerReference> service() {
112111
}
113112
}
114113

114+
/**
115+
* This service handles actually running the mark functions when this is needed. It's done this
116+
* way so that mark functions and finalizers are run on the same thread, and so that we can
117+
* avoid the use of any additional locks in this process (as these may cause deadlocks).
118+
*
119+
*/
115120
public static class MarkRunnerService extends ReferenceProcessingService<MarkingService.MarkRunnerReference> {
116121

117122
private final MarkingService markingService;
@@ -145,7 +150,7 @@ public void runAllMarkers() {
145150
MarkerReference currentMarker = markingService.getFirst();
146151
MarkerReference nextMarker;
147152
while (currentMarker != null) {
148-
nextMarker = currentMarker.next;
153+
nextMarker = currentMarker.getNext();
149154
markingService.runMarker(currentMarker);
150155
if (nextMarker == currentMarker) {
151156
throw new Error("The MarkerReference linked list structure has become broken.");
@@ -159,10 +164,9 @@ public void runAllMarkers() {
159164

160165
private final ThreadLocal<MarkerThreadLocalData> threadLocalData;
161166

162-
private final ArrayDeque<Object[]> oldKeptObjects = new ArrayDeque<>();
163-
private MarkRunnerService runnerService;
167+
private final MarkRunnerService runnerService;
164168

165-
private UnsizedQueue keptObjectQueue = new UnsizedQueue();
169+
private final UnsizedQueue keptObjectQueue = new UnsizedQueue();
166170

167171
public static class MarkerThreadLocalData {
168172
private final MarkerKeptObjects keptObjects;
@@ -279,28 +283,19 @@ public MarkerThreadLocalData getThreadLocalData() {
279283
return threadLocalData.get();
280284
}
281285

282-
@TruffleBoundary
283-
public MarkerStack getStackFromThreadLocal() {
284-
return threadLocalData.get().getPreservationStack();
285-
}
286-
287-
@TruffleBoundary
288-
public MarkerKeptObjects getKeptObjectsFromThreadLocal() {
289-
return threadLocalData.get().getKeptObjects();
290-
}
291-
292286
public MarkingService(RubyContext context, ReferenceProcessor referenceProcessor) {
293287
super(context, referenceProcessor);
294288
cacheSize = context.getOptions().CEXTS_MARKING_CACHE;
295-
threadLocalData = ThreadLocal.withInitial(() -> new MarkerThreadLocalData(this));
289+
threadLocalData = ThreadLocal.withInitial(this::makeThreadLocalData);
296290
runnerService = new MarkRunnerService(context, referenceProcessor, this);
297291
}
298292

299293
@TruffleBoundary
300-
public void makeThreadLocalData() {
294+
public MarkerThreadLocalData makeThreadLocalData() {
301295
MarkerThreadLocalData data = new MarkerThreadLocalData(this);
302296
MarkerKeptObjects keptObjects = data.getKeptObjects();
303297
context.getFinalizationService().addFinalizer(data, null, MarkingService.class, () -> getThreadLocalData().keptObjects.keepObjects(keptObjects), null);
298+
return data;
304299
}
305300

306301
@TruffleBoundary
@@ -309,28 +304,6 @@ public void queueForMarking(Object[] objects) {
309304
runnerService.add(new MarkRunnerReference(new Object(), referenceProcessor.processingQueue, runnerService));
310305
}
311306

312-
@TruffleBoundary
313-
public void runAllMarkers() {
314-
MarkerKeptObjects objects = getKeptObjectsFromThreadLocal();
315-
objects.counter = 0;
316-
oldKeptObjects.push(objects.objects);
317-
try {
318-
objects.objects = new Object[cacheSize];
319-
MarkerReference currentMarker = getFirst();
320-
MarkerReference nextMarker;
321-
while (currentMarker != null) {
322-
nextMarker = currentMarker.next;
323-
runMarker(currentMarker);
324-
if (nextMarker == currentMarker) {
325-
throw new Error("The MarkerReference linked list structure has become broken.");
326-
}
327-
currentMarker = nextMarker;
328-
}
329-
} finally {
330-
oldKeptObjects.pop();
331-
}
332-
}
333-
334307
public void addMarker(DynamicObject object, MarkerAction action) {
335308
add(new MarkerReference(object, referenceProcessor.processingQueue, action, this));
336309
}

0 commit comments

Comments
 (0)