12
12
import java .lang .ref .PhantomReference ;
13
13
import java .lang .ref .ReferenceQueue ;
14
14
import java .lang .ref .WeakReference ;
15
- import java .util .function .BiConsumer ;
16
15
17
16
import com .oracle .truffle .api .CompilerDirectives ;
18
17
import org .truffleruby .RubyContext ;
@@ -172,6 +171,7 @@ protected void processReferenceQueue(Class<?> owner) {
172
171
173
172
protected void createProcessingThread (Class <?> owner ) {
174
173
final ThreadManager threadManager = context .getThreadManager ();
174
+ final RubyLanguage language = context .getLanguageSlow ();
175
175
RubyThread newThread ;
176
176
synchronized (this ) {
177
177
if (processingThread != null ) {
@@ -205,7 +205,7 @@ protected void createProcessingThread(Class<?> owner) {
205
205
}
206
206
return ref ;
207
207
});
208
- reference .service ().processReference (context , reference );
208
+ reference .service ().processReference (context , language , reference );
209
209
}
210
210
});
211
211
}
@@ -228,7 +228,8 @@ public RubyThread getProcessingThread() {
228
228
}
229
229
230
230
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 ();
232
233
while (true ) {
233
234
@ SuppressWarnings ("unchecked" )
234
235
ProcessingReference <?> reference = (ProcessingReference <?>) processingQueue .poll ();
@@ -241,7 +242,7 @@ protected final void drainReferenceQueues() {
241
242
break ;
242
243
}
243
244
244
- reference .service ().processReference (context , reference );
245
+ reference .service ().processReference (context , language , reference );
245
246
}
246
247
}
247
248
@@ -251,21 +252,24 @@ protected final void drainReferenceQueues() {
251
252
private R first = null ;
252
253
253
254
protected final ReferenceQueue <Object > processingQueue ;
254
- protected final RubyLanguage language ;
255
255
256
256
public ReferenceProcessingService (RubyLanguage language , ReferenceQueue <Object > processingQueue ) {
257
- this .language = language ;
258
257
this .processingQueue = processingQueue ;
259
258
}
260
259
261
260
@ SuppressWarnings ("unchecked" )
262
- protected void processReference (RubyContext context , ProcessingReference <?> reference ) {
261
+ protected void processReference (RubyContext context , RubyLanguage language , ProcessingReference <?> reference ) {
263
262
remove ((R ) reference );
264
263
}
265
264
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 ) {
267
271
try {
268
- action .accept (context , reference );
272
+ action .accept (context , language , reference );
269
273
} catch (TerminationException e ) {
270
274
throw e ;
271
275
} catch (RaiseException e ) {
0 commit comments