1414package io .reactivex .internal .operators .completable ;
1515
1616import java .util .concurrent .TimeUnit ;
17+ import java .util .concurrent .atomic .AtomicReference ;
1718
1819import io .reactivex .*;
19- import io .reactivex .disposables .*;
20+ import io .reactivex .disposables .Disposable ;
21+ import io .reactivex .internal .disposables .DisposableHelper ;
2022
2123public final class CompletableDelay extends Completable {
2224
@@ -40,54 +42,70 @@ public CompletableDelay(CompletableSource source, long delay, TimeUnit unit, Sch
4042
4143 @ Override
4244 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 ));
4646 }
4747
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 ;
4958
50- private final CompositeDisposable set ;
51- final CompletableObserver s ;
59+ final Scheduler scheduler ;
5260
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+ }
5678 }
5779
5880 @ Override
5981 public void onComplete () {
60- set . add ( scheduler .scheduleDirect (new OnComplete () , delay , unit ));
82+ DisposableHelper . replace ( this , scheduler .scheduleDirect (this , delay , unit ));
6183 }
6284
6385 @ Override
6486 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 ));
6689 }
6790
6891 @ Override
69- public void onSubscribe (Disposable d ) {
70- set .add (d );
71- s .onSubscribe (set );
92+ public void dispose () {
93+ DisposableHelper .dispose (this );
7294 }
7395
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 ());
7999 }
80100
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 ();
91109 }
92110 }
93111 }
0 commit comments