Skip to content

Commit d1a7ee2

Browse files
authored
Use Disposable helper methods were applicable (#568)
1 parent 196b172 commit d1a7ee2

File tree

8 files changed

+24
-55
lines changed

8 files changed

+24
-55
lines changed

Rx.NET/Source/src/System.Reactive/Disposables/StableCompositeDisposable.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,21 +69,21 @@ public abstract bool IsDisposed
6969

7070
private sealed class Binary : StableCompositeDisposable
7171
{
72-
private volatile IDisposable _disposable1;
73-
private volatile IDisposable _disposable2;
72+
private IDisposable _disposable1;
73+
private IDisposable _disposable2;
7474

7575
public Binary(IDisposable disposable1, IDisposable disposable2)
7676
{
77-
_disposable1 = disposable1;
78-
_disposable2 = disposable2;
77+
Volatile.Write(ref _disposable1, disposable1);
78+
Volatile.Write(ref _disposable2, disposable2);
7979
}
8080

81-
public override bool IsDisposed => _disposable1 == null;
81+
public override bool IsDisposed => Disposable.GetIsDisposed(ref _disposable1);
8282

8383
public override void Dispose()
8484
{
85-
Interlocked.Exchange(ref _disposable1, null)?.Dispose();
86-
Interlocked.Exchange(ref _disposable2, null)?.Dispose();
85+
Disposable.TryDispose(ref _disposable1);
86+
Disposable.TryDispose(ref _disposable2);
8787
}
8888
}
8989

Rx.NET/Source/src/System.Reactive/Internal/ScheduledObserver.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,7 @@ protected override void Dispose(bool disposing)
328328

329329
if (disposing)
330330
{
331-
Interlocked.Exchange(ref _cancel, null)?.Dispose();
331+
Disposable.TryDispose(ref _cancel);
332332
}
333333
}
334334
}

Rx.NET/Source/src/System.Reactive/Internal/Sink.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// The .NET Foundation licenses this file to you under the Apache 2.0 License.
33
// See the LICENSE file in the project root for more information.
44

5+
using System.Reactive.Disposables;
56
using System.Threading;
67

78
namespace System.Reactive
@@ -25,8 +26,7 @@ public void Dispose()
2526
protected virtual void Dispose(bool disposing)
2627
{
2728
_observer = NopObserver<TTarget>.Instance;
28-
29-
Interlocked.Exchange(ref _cancel, null)?.Dispose();
29+
Disposable.TryDispose(ref _cancel);
3030
}
3131

3232
protected void ForwardOnNext(TTarget value)

Rx.NET/Source/src/System.Reactive/Linq/Observable/Amb.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,7 @@ public AmbObserver(IObserver<TSource> downstream, AmbCoordinator parent, bool is
9595

9696
internal void OnSubscribe(IDisposable d)
9797
{
98-
if (Interlocked.CompareExchange(ref upstream, d, null) != null)
99-
{
100-
d?.Dispose();
101-
}
98+
Disposable.SetSingle(ref upstream, d);
10299
}
103100

104101
public void Dispose()

Rx.NET/Source/src/System.Reactive/Linq/Observable/AmbMany.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,10 +205,7 @@ public void OnNext(T value)
205205

206206
internal void OnSubscribe(IDisposable d)
207207
{
208-
if (Interlocked.CompareExchange(ref upstream, d, null) != null)
209-
{
210-
d?.Dispose();
211-
}
208+
Disposable.SetSingle(ref upstream, d);
212209
}
213210
}
214211

Rx.NET/Source/src/System.Reactive/Linq/Observable/ConcatMany.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,7 @@ internal ConcatManyOuterObserver(IObserver<T> downstream)
5252

5353
internal void OnSubscribe(IDisposable d)
5454
{
55-
if (Interlocked.CompareExchange(ref upstream, d, null) != null)
56-
{
57-
d?.Dispose();
58-
}
55+
Disposable.SetSingle(ref upstream, d);
5956
}
6057

6158
public void Dispose()
@@ -178,15 +175,7 @@ internal sealed class InnerObserver : IObserver<T>, IDisposable
178175
{
179176
readonly ConcatManyOuterObserver parent;
180177

181-
internal SingleAssignmentDisposable upstream;
182-
183-
static readonly SingleAssignmentDisposable DISPOSED;
184-
185-
static InnerObserver()
186-
{
187-
DISPOSED = new SingleAssignmentDisposable();
188-
DISPOSED.Dispose();
189-
}
178+
internal IDisposable upstream;
190179

191180
internal InnerObserver(ConcatManyOuterObserver parent)
192181
{
@@ -195,13 +184,13 @@ internal InnerObserver(ConcatManyOuterObserver parent)
195184

196185
internal bool SetDisposable(SingleAssignmentDisposable sad)
197186
{
198-
return Interlocked.CompareExchange(ref upstream, sad, null) == null;
187+
return Disposable.TrySetSingle(ref upstream, sad) == TrySetSingleResult.Success;
199188
}
200189

201190
internal bool Finish()
202191
{
203192
var sad = Volatile.Read(ref upstream);
204-
if (sad != DISPOSED)
193+
if (sad != BooleanDisposable.True)
205194
{
206195
if (Interlocked.CompareExchange(ref upstream, null, sad) == sad)
207196
{
@@ -214,7 +203,7 @@ internal bool Finish()
214203

215204
public void Dispose()
216205
{
217-
Interlocked.Exchange(ref upstream, DISPOSED)?.Dispose();
206+
Disposable.TryDispose(ref upstream);
218207
}
219208

220209
public void OnCompleted()

Rx.NET/Source/src/System.Reactive/Linq/Observable/RetryWhen.cs

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,25 +61,17 @@ sealed class MainObserver : IObserver<T>, IDisposable
6161
readonly IObserver<Exception> errorSignal;
6262

6363
internal readonly HandlerObserver handlerObserver;
64-
64+
6565
readonly IObservable<T> source;
6666

67-
SingleAssignmentDisposable upstream;
67+
IDisposable upstream;
6868

6969
int trampoline;
7070

7171
int halfSerializer;
7272

7373
Exception error;
7474

75-
static readonly SingleAssignmentDisposable DISPOSED;
76-
77-
static MainObserver()
78-
{
79-
DISPOSED = new SingleAssignmentDisposable();
80-
DISPOSED.Dispose();
81-
}
82-
8375
internal MainObserver(IObserver<T> downstream, IObservable<T> source, IObserver<Exception> errorSignal)
8476
{
8577
this.downstream = downstream;
@@ -90,7 +82,7 @@ internal MainObserver(IObserver<T> downstream, IObservable<T> source, IObserver<
9082

9183
public void Dispose()
9284
{
93-
Interlocked.Exchange(ref upstream, DISPOSED)?.Dispose();
85+
Disposable.TryDispose(ref upstream);
9486
handlerObserver.Dispose();
9587
}
9688

@@ -108,7 +100,7 @@ public void OnError(Exception error)
108100
for (; ; )
109101
{
110102
var d = Volatile.Read(ref upstream);
111-
if (d == DISPOSED)
103+
if (d == BooleanDisposable.True)
112104
{
113105
break;
114106
}
@@ -168,7 +160,7 @@ internal void HandlerNext()
168160
do
169161
{
170162
var sad = new SingleAssignmentDisposable();
171-
if (Interlocked.CompareExchange(ref upstream, sad, null) != null)
163+
if (Disposable.TrySetSingle(ref upstream, sad) != TrySetSingleResult.Success)
172164
{
173165
return;
174166
}
@@ -192,10 +184,7 @@ internal HandlerObserver(MainObserver main)
192184

193185
internal void OnSubscribe(IDisposable d)
194186
{
195-
if (Interlocked.CompareExchange(ref upstream, d, null) != null)
196-
{
197-
d?.Dispose();
198-
}
187+
Disposable.SetSingle(ref upstream, d);
199188
}
200189

201190
public void Dispose()

Rx.NET/Source/src/System.Reactive/Linq/QueryLanguage.Creation.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,7 @@ public void OnError(Exception error)
178178

179179
public void OnNext(IDisposable value)
180180
{
181-
if (Interlocked.CompareExchange(ref disposable, value, null) != null)
182-
{
183-
value?.Dispose();
184-
}
181+
Disposable.SetSingle(ref disposable, value);
185182
}
186183
}
187184
}

0 commit comments

Comments
 (0)