@@ -11,11 +11,10 @@ public class SimpleFuture<T> extends SimpleCancellable implements DependentFutur
11
11
private AsyncSemaphore waiter ;
12
12
private Exception exception ;
13
13
private T result ;
14
- boolean silent ;
15
- private FutureCallback <T > callback ;
16
- private FutureCallbackInternal internalCallback ;
14
+ private boolean silent ;
15
+ private FutureCallbackInternal <T > internalCallback ;
17
16
18
- private interface FutureCallbackInternal <T > {
17
+ protected interface FutureCallbackInternal <T > {
19
18
void onCompleted (Exception e , T result , FutureCallsite next );
20
19
}
21
20
@@ -43,16 +42,14 @@ private boolean cancelInternal(boolean silent) {
43
42
if (!super .cancel ())
44
43
return false ;
45
44
// still need to release any pending waiters
46
- FutureCallback <T > callback ;
47
45
FutureCallbackInternal <T > internalCallback ;
48
46
synchronized (this ) {
49
47
exception = new CancellationException ();
50
48
releaseWaiterLocked ();
51
- callback = handleCompleteLocked ();
52
49
internalCallback = handleInternalCompleteLocked ();
53
50
this .silent = silent ;
54
51
}
55
- handleCallbackUnlocked (null , callback , internalCallback );
52
+ handleCallbackUnlocked (null , internalCallback );
56
53
return true ;
57
54
}
58
55
@@ -101,18 +98,6 @@ public boolean setComplete() {
101
98
return setComplete ((T )null );
102
99
}
103
100
104
- private FutureCallback <T > handleCompleteLocked () {
105
- // don't execute the callback inside the sync block... possible hangup
106
- // read the callback value, and then call it outside the block.
107
- // can't simply call this.callback.onCompleted directly outside the block,
108
- // because that may result in a race condition where the callback changes once leaving
109
- // the block.
110
- FutureCallback <T > callback = this .callback ;
111
- // null out members to allow garbage collection
112
- this .callback = null ;
113
- return callback ;
114
- }
115
-
116
101
private FutureCallbackInternal <T > handleInternalCompleteLocked () {
117
102
// don't execute the callback inside the sync block... possible hangup
118
103
// read the callback value, and then call it outside the block.
@@ -121,7 +106,7 @@ private FutureCallbackInternal<T> handleInternalCompleteLocked() {
121
106
// the block.
122
107
FutureCallbackInternal <T > callback = this .internalCallback ;
123
108
// null out members to allow garbage collection
124
- this .callback = null ;
109
+ this .internalCallback = null ;
125
110
return callback ;
126
111
}
127
112
@@ -147,13 +132,9 @@ void loop() {
147
132
}
148
133
}
149
134
150
- private void handleCallbackUnlocked (FutureCallsite callsite , FutureCallback < T > callback , FutureCallbackInternal <T > internalCallback ) {
135
+ private void handleCallbackUnlocked (FutureCallsite callsite , FutureCallbackInternal <T > internalCallback ) {
151
136
if (silent )
152
137
return ;
153
- if (callback != null ) {
154
- callback .onCompleted (exception , result );
155
- return ;
156
- }
157
138
158
139
if (internalCallback == null )
159
140
return ;
@@ -198,47 +179,42 @@ public boolean setComplete(Exception e, T value) {
198
179
}
199
180
200
181
private boolean setComplete (Exception e , T value , FutureCallsite callsite ) {
201
- FutureCallback <T > callback ;
202
- FutureCallbackInternal internalCallback ;
182
+ FutureCallbackInternal <T > internalCallback ;
203
183
synchronized (this ) {
204
184
if (!super .setComplete ())
205
185
return false ;
206
186
result = value ;
207
187
exception = e ;
208
188
releaseWaiterLocked ();
209
- callback = handleCompleteLocked ();
210
189
internalCallback = handleInternalCompleteLocked ();
211
190
}
212
- handleCallbackUnlocked (callsite , callback , internalCallback );
191
+ handleCallbackUnlocked (callsite , internalCallback );
213
192
return true ;
214
193
}
215
194
216
- private void setCallbackInternal (FutureCallsite callsite , FutureCallback < T > callback , FutureCallbackInternal <T > internalCallback ) {
195
+ void setCallbackInternal (FutureCallsite callsite , FutureCallbackInternal <T > internalCallback ) {
217
196
// callback can only be changed or read/used inside a sync block
218
197
synchronized (this ) {
219
- // done or cancelled,
220
- this .callback = callback ;
221
198
this .internalCallback = internalCallback ;
222
199
if (!isDone () && !isCancelled ())
223
200
return ;
224
201
225
- callback = handleCompleteLocked ();
226
202
internalCallback = handleInternalCompleteLocked ();
227
203
}
228
- handleCallbackUnlocked (callsite , callback , internalCallback );
204
+ handleCallbackUnlocked (callsite , internalCallback );
229
205
}
230
206
231
207
@ Override
232
208
public void setCallback (FutureCallback <T > callback ) {
233
- setCallbackInternal (null , callback , null );
209
+ setCallbackInternal (null , ( e , result , next ) -> callback . onCompleted ( e , result ) );
234
210
}
235
211
236
212
private Future <T > setComplete (Future <T > future , FutureCallsite callsite ) {
237
213
setParent (future );
238
214
239
215
SimpleFuture <T > ret = new SimpleFuture <>();
240
216
if (future instanceof SimpleFuture ) {
241
- ((SimpleFuture <T >)future ).setCallbackInternal (callsite , null ,
217
+ ((SimpleFuture <T >)future ).setCallbackInternal (callsite ,
242
218
(e , result , next ) ->
243
219
ret .setComplete (SimpleFuture .this .setComplete (e , result , next ) ? null : new CancellationException (), result , next ));
244
220
}
@@ -259,20 +235,21 @@ public Future<T> setComplete(Future<T> future) {
259
235
return setComplete (future , null );
260
236
}
261
237
238
+
262
239
/**
263
240
* THIS METHOD IS FOR TEST USE ONLY
264
241
* @return
265
242
*/
266
243
@ Deprecated
267
- public FutureCallback < T > getCallback () {
268
- return callback ;
244
+ public Object getCallback () {
245
+ return internalCallback ;
269
246
}
270
247
271
248
@ Override
272
249
public Future <T > done (DoneCallback <T > done ) {
273
250
final SimpleFuture <T > ret = new SimpleFuture <>();
274
251
ret .setParent (this );
275
- setCallbackInternal (null , null , (e , result , next ) -> {
252
+ setCallbackInternal (null , (e , result , next ) -> {
276
253
if (e == null ) {
277
254
try {
278
255
done .done (e , result );
@@ -293,7 +270,7 @@ public Future<T> done(DoneCallback<T> done) {
293
270
public Future <T > success (SuccessCallback <T > callback ) {
294
271
final SimpleFuture <T > ret = new SimpleFuture <>();
295
272
ret .setParent (this );
296
- setCallbackInternal (null , null , (e , result , next ) -> {
273
+ setCallbackInternal (null , (e , result , next ) -> {
297
274
if (e == null ) {
298
275
try {
299
276
callback .success (result );
@@ -314,7 +291,7 @@ public Future<T> success(SuccessCallback<T> callback) {
314
291
public <R > Future <R > then (ThenFutureCallback <R , T > then ) {
315
292
final SimpleFuture <R > ret = new SimpleFuture <>();
316
293
ret .setParent (this );
317
- setCallbackInternal (null , null , (e , result , next ) -> {
294
+ setCallbackInternal (null , (e , result , next ) -> {
318
295
if (e != null ) {
319
296
ret .setComplete (e , null , next );
320
297
return ;
@@ -350,7 +327,7 @@ public Future<T> fail(FailCallback fail) {
350
327
public Future <T > failRecover (FailRecoverCallback <T > fail ) {
351
328
SimpleFuture <T > ret = new SimpleFuture <>();
352
329
ret .setParent (this );
353
- setCallbackInternal (null , null , (e , result , next ) -> {
330
+ setCallbackInternal (null , (e , result , next ) -> {
354
331
if (e == null ) {
355
332
ret .setComplete (e , result , next );
356
333
return ;
@@ -388,7 +365,7 @@ public SimpleFuture<T> reset() {
388
365
result = null ;
389
366
exception = null ;
390
367
waiter = null ;
391
- callback = null ;
368
+ internalCallback = null ;
392
369
silent = false ;
393
370
394
371
return this ;
0 commit comments