Skip to content

Commit 27eb038

Browse files
committed
* I like _isDisposing better. So sue me!
* Move the `Interlocked.Exchange` code to a getter, for readability. * Minor nullable change.
1 parent 2edfc82 commit 27eb038

File tree

4 files changed

+66
-13
lines changed

4 files changed

+66
-13
lines changed

projects/RabbitMQ.Client/Impl/AutorecoveringChannel.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ internal sealed class AutorecoveringChannel : IChannel, IRecoverable
4949
private AutorecoveringConnection _connection;
5050
private RecoveryAwareChannel _innerChannel;
5151
private bool _disposed;
52-
private int _disposeSignaled;
52+
private int _isDisposing;
5353

5454
private ushort _prefetchCountConsumer;
5555
private ushort _prefetchCountGlobal;
@@ -258,7 +258,7 @@ public override string ToString()
258258

259259
public async ValueTask DisposeAsync()
260260
{
261-
if (Interlocked.Exchange(ref _disposeSignaled, 1) != 0)
261+
if (IsDisposing)
262262
{
263263
return;
264264
}
@@ -495,5 +495,18 @@ private void ThrowIfDisposed()
495495
[DoesNotReturn]
496496
static void ThrowDisposed() => throw new ObjectDisposedException(typeof(AutorecoveringChannel).FullName);
497497
}
498+
499+
private bool IsDisposing
500+
{
501+
get
502+
{
503+
if (Interlocked.Exchange(ref _isDisposing, 1) != 0)
504+
{
505+
return true;
506+
}
507+
508+
return false;
509+
}
510+
}
498511
}
499512
}

projects/RabbitMQ.Client/Impl/AutorecoveringConnection.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ internal sealed partial class AutorecoveringConnection : IConnection
5151

5252
private Connection _innerConnection;
5353
private bool _disposed;
54-
private int _disposeSignaled;
54+
private int _isDisposing;
5555

5656
private Connection InnerConnection
5757
{
@@ -274,7 +274,7 @@ await RecordChannelAsync(autorecoveringChannel, channelsSemaphoreHeld: false, ca
274274

275275
public async ValueTask DisposeAsync()
276276
{
277-
if (Interlocked.Exchange(ref _disposeSignaled, 1) != 0)
277+
if (IsDisposing)
278278
{
279279
return;
280280
}
@@ -315,5 +315,18 @@ private void ThrowIfDisposed()
315315
[DoesNotReturn]
316316
static void ThrowDisposed() => throw new ObjectDisposedException(typeof(AutorecoveringConnection).FullName);
317317
}
318+
319+
private bool IsDisposing
320+
{
321+
get
322+
{
323+
if (Interlocked.Exchange(ref _isDisposing, 1) != 0)
324+
{
325+
return true;
326+
}
327+
328+
return false;
329+
}
330+
}
318331
}
319332
}

projects/RabbitMQ.Client/Impl/Channel.cs

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ internal partial class Channel : IChannel, IRecoverable
6464
internal readonly IConsumerDispatcher ConsumerDispatcher;
6565

6666
private bool _disposed;
67-
private int _disposeSignaled;
67+
private int _isDisposing;
6868

6969
public Channel(ISession session, CreateChannelOptions createChannelOptions)
7070
{
@@ -529,7 +529,7 @@ void IDisposable.Dispose()
529529

530530
protected virtual void Dispose(bool disposing)
531531
{
532-
if (Interlocked.Exchange(ref _disposeSignaled, 1) != 0)
532+
if (IsDisposing)
533533
{
534534
return;
535535
}
@@ -567,7 +567,7 @@ await DisposeAsyncCore()
567567

568568
protected virtual async ValueTask DisposeAsyncCore()
569569
{
570-
if (Interlocked.Exchange(ref _disposeSignaled, 1) != 0)
570+
if (IsDisposing)
571571
{
572572
return;
573573
}
@@ -694,11 +694,12 @@ protected virtual ulong AdjustDeliveryTag(ulong deliveryTag)
694694

695695
protected async Task<bool> HandleChannelCloseAsync(IncomingCommand cmd, CancellationToken cancellationToken)
696696
{
697-
var serverOriginatedChannelCloseTcs = _serverOriginatedChannelCloseTcs;
697+
TaskCompletionSource<bool>? serverOriginatedChannelCloseTcs = _serverOriginatedChannelCloseTcs;
698698
if (serverOriginatedChannelCloseTcs is null)
699699
{
700700
// Attempt to assign the new TCS only if _tcs is still null
701-
_ = Interlocked.CompareExchange(ref _serverOriginatedChannelCloseTcs, new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously), null);
701+
_ = Interlocked.CompareExchange(ref _serverOriginatedChannelCloseTcs,
702+
new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously), null);
702703
}
703704

704705
try
@@ -720,12 +721,12 @@ await ModelSendAsync(in method, cancellationToken)
720721
await Session.NotifyAsync(cancellationToken)
721722
.ConfigureAwait(false);
722723

723-
_serverOriginatedChannelCloseTcs.TrySetResult(true);
724+
_serverOriginatedChannelCloseTcs?.TrySetResult(true);
724725
return true;
725726
}
726727
catch (Exception ex)
727728
{
728-
_serverOriginatedChannelCloseTcs.TrySetException(ex);
729+
_serverOriginatedChannelCloseTcs?.TrySetException(ex);
729730
throw;
730731
}
731732
}
@@ -1647,5 +1648,18 @@ private Task<bool> DispatchCommandAsync(IncomingCommand cmd, CancellationToken c
16471648
}
16481649
}
16491650
}
1651+
1652+
private bool IsDisposing
1653+
{
1654+
get
1655+
{
1656+
if (Interlocked.Exchange(ref _isDisposing, 1) != 0)
1657+
{
1658+
return true;
1659+
}
1660+
1661+
return false;
1662+
}
1663+
}
16501664
}
16511665
}

projects/RabbitMQ.Client/Impl/Connection.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ namespace RabbitMQ.Client.Framing
4747
internal sealed partial class Connection : IConnection
4848
{
4949
private bool _disposed;
50-
private int _disposeSignaled;
50+
private int _isDisposing;
5151
private volatile bool _closed;
5252

5353
private readonly ConnectionConfig _config;
@@ -491,7 +491,7 @@ internal ValueTask WriteAsync(RentedMemory frames, CancellationToken cancellatio
491491

492492
public async ValueTask DisposeAsync()
493493
{
494-
if (Interlocked.Exchange(ref _disposeSignaled, 1) != 0)
494+
if (IsDisposing)
495495
{
496496
return;
497497
}
@@ -544,5 +544,18 @@ private static void ThrowAlreadyClosedException(ShutdownEventArgs closeReason)
544544
{
545545
throw new AlreadyClosedException(closeReason);
546546
}
547+
548+
private bool IsDisposing
549+
{
550+
get
551+
{
552+
if (Interlocked.Exchange(ref _isDisposing, 1) != 0)
553+
{
554+
return true;
555+
}
556+
557+
return false;
558+
}
559+
}
547560
}
548561
}

0 commit comments

Comments
 (0)