14
14
package io .reactivex .internal .operators .completable ;
15
15
16
16
import java .util .concurrent .TimeUnit ;
17
+ import java .util .concurrent .atomic .AtomicReference ;
17
18
18
19
import io .reactivex .*;
19
- import io .reactivex .disposables .*;
20
+ import io .reactivex .disposables .Disposable ;
21
+ import io .reactivex .internal .disposables .DisposableHelper ;
20
22
21
23
public final class CompletableDelay extends Completable {
22
24
@@ -40,54 +42,70 @@ public CompletableDelay(CompletableSource source, long delay, TimeUnit unit, Sch
40
42
41
43
@ Override
42
44
protected void subscribeActual (final CompletableObserver s ) {
43
- final CompositeDisposable set = new CompositeDisposable ();
44
-
45
- source .subscribe (new Delay (set , s ));
45
+ source .subscribe (new Delay (s , delay , unit , scheduler , delayError ));
46
46
}
47
47
48
- final class Delay implements CompletableObserver {
48
+ static final class Delay extends AtomicReference <Disposable >
49
+ implements CompletableObserver , Runnable , Disposable {
50
+
51
+ private static final long serialVersionUID = 465972761105851022L ;
52
+
53
+ final CompletableObserver downstream ;
54
+
55
+ final long delay ;
56
+
57
+ final TimeUnit unit ;
49
58
50
- private final CompositeDisposable set ;
51
- final CompletableObserver s ;
59
+ final Scheduler scheduler ;
52
60
53
- Delay (CompositeDisposable set , CompletableObserver s ) {
54
- this .set = set ;
55
- this .s = s ;
61
+ final boolean delayError ;
62
+
63
+ Throwable error ;
64
+
65
+ Delay (CompletableObserver downstream , long delay , TimeUnit unit , Scheduler scheduler , boolean delayError ) {
66
+ this .downstream = downstream ;
67
+ this .delay = delay ;
68
+ this .unit = unit ;
69
+ this .scheduler = scheduler ;
70
+ this .delayError = delayError ;
71
+ }
72
+
73
+ @ Override
74
+ public void onSubscribe (Disposable d ) {
75
+ if (DisposableHelper .setOnce (this , d )) {
76
+ downstream .onSubscribe (this );
77
+ }
56
78
}
57
79
58
80
@ Override
59
81
public void onComplete () {
60
- set . add ( scheduler .scheduleDirect (new OnComplete () , delay , unit ));
82
+ DisposableHelper . replace ( this , scheduler .scheduleDirect (this , delay , unit ));
61
83
}
62
84
63
85
@ Override
64
86
public void onError (final Throwable e ) {
65
- set .add (scheduler .scheduleDirect (new OnError (e ), delayError ? delay : 0 , unit ));
87
+ error = e ;
88
+ DisposableHelper .replace (this , scheduler .scheduleDirect (this , delayError ? delay : 0 , unit ));
66
89
}
67
90
68
91
@ Override
69
- public void onSubscribe (Disposable d ) {
70
- set .add (d );
71
- s .onSubscribe (set );
92
+ public void dispose () {
93
+ DisposableHelper .dispose (this );
72
94
}
73
95
74
- final class OnComplete implements Runnable {
75
- @ Override
76
- public void run () {
77
- s .onComplete ();
78
- }
96
+ @ Override
97
+ public boolean isDisposed () {
98
+ return DisposableHelper .isDisposed (get ());
79
99
}
80
100
81
- final class OnError implements Runnable {
82
- private final Throwable e ;
83
-
84
- OnError (Throwable e ) {
85
- this .e = e ;
86
- }
87
-
88
- @ Override
89
- public void run () {
90
- s .onError (e );
101
+ @ Override
102
+ public void run () {
103
+ Throwable e = error ;
104
+ error = null ;
105
+ if (e != null ) {
106
+ downstream .onError (e );
107
+ } else {
108
+ downstream .onComplete ();
91
109
}
92
110
}
93
111
}
0 commit comments