Skip to content

Commit cf51836

Browse files
authored
Merge pull request #197 from AArnott/closeStreamWithMxChannel
Dispose of streams used as mxstream channels when channels close
2 parents 14832da + 9636686 commit cf51836

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

src/Nerdbank.Streams.Tests/MultiplexingStreamTests.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,33 @@ public async Task Dispose_DisposesChannels()
205205
#pragma warning restore CS0618 // Type or member is obsolete
206206
}
207207

208+
[Fact]
209+
public async Task ChannelDispose_ClosesExistingStream()
210+
{
211+
var ms = new MonitoringStream(new MemoryStream());
212+
var disposal = new AsyncManualResetEvent();
213+
ms.Disposed += (s, e) => disposal.Set();
214+
215+
var channel = this.mx1.CreateChannel(new MultiplexingStream.ChannelOptions { ExistingPipe = ms.UsePipe() });
216+
channel.Dispose();
217+
await disposal.WaitAsync(this.TimeoutToken);
218+
}
219+
220+
[Fact]
221+
public async Task RemoteChannelClose_ClosesExistingStream()
222+
{
223+
var ms = new MonitoringStream(new MemoryStream());
224+
var disposal = new AsyncManualResetEvent();
225+
ms.Disposed += (s, e) => disposal.Set();
226+
227+
var ch1 = this.mx1.CreateChannel(new MultiplexingStream.ChannelOptions { ExistingPipe = ms.UsePipe() });
228+
await this.WaitForEphemeralChannelOfferToPropagateAsync();
229+
var ch2 = this.mx2.AcceptChannel(ch1.Id);
230+
231+
ch2.Dispose();
232+
await disposal.WaitAsync(this.TimeoutToken);
233+
}
234+
208235
[Fact]
209236
public async Task CreateChannelAsync_ThrowsAfterDisposal()
210237
{

src/Nerdbank.Streams/PipeExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,10 +414,13 @@ internal static Task LinkToAsync(this PipeReader reader, PipeWriter writer, bool
414414
break;
415415
}
416416
}
417+
418+
await reader.CompleteAsync().ConfigureAwait(false);
417419
}
418420
catch (Exception ex)
419421
{
420422
await writer.CompleteAsync(ex).ConfigureAwait(false);
423+
await reader.CompleteAsync(ex).ConfigureAwait(false);
421424
}
422425
});
423426
}

0 commit comments

Comments
 (0)