25
25
26
26
import com .oracle .truffle .api .CompilerDirectives .TruffleBoundary ;
27
27
28
- public abstract class ReferenceProcessingService <R extends ReferenceProcessingService .ProcessingReference < R > > {
28
+ public abstract class ReferenceProcessingService <R extends ReferenceProcessingService .PhantomProcessingReference < R , T >, T > {
29
29
30
- public static interface ProcessingReference <R extends ProcessingReference <R >> {
31
- public R getPrevious ();
32
-
33
- public void setPrevious (R previous );
34
-
35
- public R getNext ();
36
-
37
- public void setNext (R next );
38
-
39
- public void remove ();
40
-
41
- public ReferenceProcessingService <R > service ();
42
- }
43
-
44
- public abstract static class WeakProcessingReference <R extends ProcessingReference <R >, T > extends WeakReference <T >
45
- implements ProcessingReference <R > {
46
-
47
- private R next ;
48
- private R previous ;
49
- private ReferenceProcessingService <R > service ;
50
-
51
- public WeakProcessingReference (
52
- T object ,
53
- ReferenceQueue <? super Object > queue ,
54
- ReferenceProcessingService <R > service ) {
55
- super (object , queue );
56
- this .service = service ;
57
- }
58
-
59
- private void check (R previous , R next ) {
60
- if (next != null && next == previous ) {
61
- throw CompilerDirectives .shouldNotReachHere ("broken doubly-linked list of WeakProcessingReference" );
62
- }
63
- }
64
-
65
- public R getPrevious () {
66
- return previous ;
67
- }
68
-
69
- public void setPrevious (R previous ) {
70
- check (previous , next );
71
- this .previous = previous ;
72
- }
73
-
74
- public R getNext () {
75
- return next ;
76
- }
77
-
78
- public void setNext (R next ) {
79
- check (previous , next );
80
- this .next = next ;
81
- }
82
-
83
- @ SuppressWarnings ("unchecked" )
84
- public void remove () {
85
- this .next = (R ) this ;
86
- this .previous = (R ) this ;
87
- }
88
-
89
- public ReferenceProcessingService <R > service () {
90
- return service ;
91
- }
92
- }
93
-
94
- public abstract static class PhantomProcessingReference <R extends ProcessingReference <R >, T >
30
+ public abstract static class PhantomProcessingReference <R extends PhantomProcessingReference <R , T >, T >
95
31
extends
96
- PhantomReference <T > implements ProcessingReference < R > {
32
+ PhantomReference <T > {
97
33
98
34
/** Doubly linked list of references to keep to allow the reference service to traverse them and to keep the
99
35
* references alive for processing. */
100
36
private R next ;
101
37
private R previous ;
102
- private ReferenceProcessingService <R > service ;
38
+ private ReferenceProcessingService <R , T > service ;
103
39
104
40
public PhantomProcessingReference (
105
41
T object ,
106
42
ReferenceQueue <? super Object > queue ,
107
- ReferenceProcessingService <R > service ) {
43
+ ReferenceProcessingService <R , T > service ) {
108
44
super (object , queue );
109
45
this .service = service ;
110
46
}
@@ -131,7 +67,7 @@ public void remove() {
131
67
this .previous = (R ) this ;
132
68
}
133
69
134
- public ReferenceProcessingService <R > service () {
70
+ public ReferenceProcessingService <R , T > service () {
135
71
return service ;
136
72
}
137
73
}
@@ -147,7 +83,7 @@ public ReferenceProcessor(RubyContext context) {
147
83
this .context = context ;
148
84
}
149
85
150
- protected void processReferenceQueue (ReferenceProcessingService <?> service ) {
86
+ protected void processReferenceQueue (ReferenceProcessingService <?, ? > service ) {
151
87
if (processOnMainThread ()) {
152
88
drainReferenceQueues ();
153
89
} else {
@@ -171,7 +107,7 @@ public boolean processOnMainThread() {
171
107
private static final String THREAD_NAME = "Ruby-reference-processor" ;
172
108
173
109
@ TruffleBoundary
174
- protected void createProcessingThread (ReferenceProcessingService <?> service ) {
110
+ protected void createProcessingThread (ReferenceProcessingService <?, ? > service ) {
175
111
final ThreadManager threadManager = context .getThreadManager ();
176
112
final RubyLanguage language = context .getLanguageSlow ();
177
113
RubyThread newThread ;
@@ -187,10 +123,10 @@ protected void createProcessingThread(ReferenceProcessingService<?> service) {
187
123
188
124
threadManager .initialize (newThread , DummyNode .INSTANCE , THREAD_NAME , sharingReason , () -> {
189
125
while (true ) {
190
- final ProcessingReference < ?> reference = threadManager
126
+ final PhantomProcessingReference <?, ?> reference = threadManager
191
127
.runUntilResult (DummyNode .INSTANCE , () -> {
192
128
try {
193
- return (ProcessingReference < ?>) processingQueue .remove ();
129
+ return (PhantomProcessingReference <?, ?>) processingQueue .remove ();
194
130
} catch (InterruptedException interrupted ) {
195
131
if (shutdown ) {
196
132
throw new KillException (DummyNode .INSTANCE );
@@ -226,7 +162,7 @@ protected final void drainReferenceQueues() {
226
162
final RubyLanguage language = context .getLanguageSlow ();
227
163
while (true ) {
228
164
@ SuppressWarnings ("unchecked" )
229
- ProcessingReference <? > reference = (ProcessingReference < ?>) processingQueue .poll ();
165
+ PhantomProcessingReference <?, ? > reference = (PhantomProcessingReference <?, ?>) processingQueue .poll ();
230
166
231
167
if (reference == null ) {
232
168
break ;
@@ -248,7 +184,7 @@ public ReferenceProcessingService(ReferenceQueue<Object> processingQueue) {
248
184
}
249
185
250
186
@ SuppressWarnings ("unchecked" )
251
- protected void processReference (RubyContext context , RubyLanguage language , ProcessingReference < ?> reference ) {
187
+ protected void processReference (RubyContext context , RubyLanguage language , PhantomProcessingReference <?, ?> reference ) {
252
188
remove ((R ) reference );
253
189
}
254
190
@@ -272,7 +208,6 @@ protected void runCatchingErrors(RubyContext context, RubyLanguage language,
272
208
}
273
209
}
274
210
275
- @ TruffleBoundary
276
211
protected synchronized void remove (R ref ) {
277
212
if (ref .getNext () == ref ) {
278
213
// Already removed.
@@ -302,7 +237,6 @@ protected synchronized void remove(R ref) {
302
237
ref .remove ();
303
238
}
304
239
305
- @ TruffleBoundary
306
240
protected synchronized void add (R newRef ) {
307
241
if (first != null ) {
308
242
newRef .setNext (first );
0 commit comments