11
11
12
12
import java .lang .ref .ReferenceQueue ;
13
13
import java .lang .ref .WeakReference ;
14
- import java .util .ArrayDeque ;
15
14
import java .util .ArrayList ;
16
15
17
16
import org .truffleruby .RubyContext ;
@@ -112,6 +111,12 @@ public ReferenceProcessingService<MarkRunnerReference> service() {
112
111
}
113
112
}
114
113
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
+ */
115
120
public static class MarkRunnerService extends ReferenceProcessingService <MarkingService .MarkRunnerReference > {
116
121
117
122
private final MarkingService markingService ;
@@ -145,7 +150,7 @@ public void runAllMarkers() {
145
150
MarkerReference currentMarker = markingService .getFirst ();
146
151
MarkerReference nextMarker ;
147
152
while (currentMarker != null ) {
148
- nextMarker = currentMarker .next ;
153
+ nextMarker = currentMarker .getNext () ;
149
154
markingService .runMarker (currentMarker );
150
155
if (nextMarker == currentMarker ) {
151
156
throw new Error ("The MarkerReference linked list structure has become broken." );
@@ -159,10 +164,9 @@ public void runAllMarkers() {
159
164
160
165
private final ThreadLocal <MarkerThreadLocalData > threadLocalData ;
161
166
162
- private final ArrayDeque <Object []> oldKeptObjects = new ArrayDeque <>();
163
- private MarkRunnerService runnerService ;
167
+ private final MarkRunnerService runnerService ;
164
168
165
- private UnsizedQueue keptObjectQueue = new UnsizedQueue ();
169
+ private final UnsizedQueue keptObjectQueue = new UnsizedQueue ();
166
170
167
171
public static class MarkerThreadLocalData {
168
172
private final MarkerKeptObjects keptObjects ;
@@ -279,28 +283,19 @@ public MarkerThreadLocalData getThreadLocalData() {
279
283
return threadLocalData .get ();
280
284
}
281
285
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
-
292
286
public MarkingService (RubyContext context , ReferenceProcessor referenceProcessor ) {
293
287
super (context , referenceProcessor );
294
288
cacheSize = context .getOptions ().CEXTS_MARKING_CACHE ;
295
- threadLocalData = ThreadLocal .withInitial (() -> new MarkerThreadLocalData ( this ) );
289
+ threadLocalData = ThreadLocal .withInitial (this :: makeThreadLocalData );
296
290
runnerService = new MarkRunnerService (context , referenceProcessor , this );
297
291
}
298
292
299
293
@ TruffleBoundary
300
- public void makeThreadLocalData () {
294
+ public MarkerThreadLocalData makeThreadLocalData () {
301
295
MarkerThreadLocalData data = new MarkerThreadLocalData (this );
302
296
MarkerKeptObjects keptObjects = data .getKeptObjects ();
303
297
context .getFinalizationService ().addFinalizer (data , null , MarkingService .class , () -> getThreadLocalData ().keptObjects .keepObjects (keptObjects ), null );
298
+ return data ;
304
299
}
305
300
306
301
@ TruffleBoundary
@@ -309,28 +304,6 @@ public void queueForMarking(Object[] objects) {
309
304
runnerService .add (new MarkRunnerReference (new Object (), referenceProcessor .processingQueue , runnerService ));
310
305
}
311
306
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
-
334
307
public void addMarker (DynamicObject object , MarkerAction action ) {
335
308
add (new MarkerReference (object , referenceProcessor .processingQueue , action , this ));
336
309
}
0 commit comments