Skip to content

Commit 39507df

Browse files
committed
revert connection close offloaded to threadpool, close blocks
make QuicPeerConnection.Handle the primary accessor for _handle, use interlocked access/manipulation
1 parent 36452c6 commit 39507df

File tree

4 files changed

+20
-18
lines changed

4 files changed

+20
-18
lines changed

StirlingLabs.MsQuic/QuicClientConnection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ private unsafe int ManagedCallback(ref QUIC_CONNECTION_EVENT @event)
137137
private void OnConnected()
138138
=> Connected?.Invoke(this);
139139

140-
public override unsafe void Dispose()
140+
public override void Dispose()
141141
=> Close();
142142

143143
public unsafe void Start(SizedUtf8String name, ushort port)
@@ -185,5 +185,5 @@ protected override int DefaultCertificateReceivedStatus
185185
=> QUIC_STATUS_SUCCESS;
186186

187187
public override unsafe string ToString()
188-
=> Name is null ? $"[QuicClientConnection 0x{(ulong)_handle:X}]" : $"[QuicClientConnection \"{Name}\" 0x{(ulong)_handle:X}]";
188+
=> Name is null ? $"[QuicClientConnection 0x{(ulong)Handle:X}]" : $"[QuicClientConnection \"{Name}\" 0x{(ulong)Handle:X}]";
189189
}

StirlingLabs.MsQuic/QuicPeerConnection.ReliableDatagrams.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ private void AcknowledgeReliableDatagramById(ulong i)
9090
if (!_reliableDatagramsSentUnacknowledged.TryGetValue(i, out var dg))
9191
return;
9292

93+
// ReSharper disable once RedundantAssignment
9394
var removed = _reliableDatagramsSentUnacknowledged.Remove(i);
9495
Debug.Assert(removed);
9596

@@ -111,7 +112,7 @@ protected internal bool RemoveFromUnacknowledged(IQuicDatagramReliable dg)
111112
}
112113

113114
[SuppressMessage("Reliability", "CA2000", Justification = "Disposed only after finished sending")]
114-
private unsafe bool TrySendDatagramAcks(SortedSet<ulong> toAck)
115+
private bool TrySendDatagramAcks(SortedSet<ulong> toAck)
115116
{
116117
Debug.Assert(Monitor.IsEntered(_reliableDatagramAckLock));
117118

@@ -135,6 +136,7 @@ private unsafe bool TrySendDatagramAcks(SortedSet<ulong> toAck)
135136

136137
span = mem.Span;
137138

139+
// ReSharper disable once RedundantAssignment
138140
var headerSizeEncoded = VarIntSqlite4.Encode((ulong)length, span);
139141
Debug.Assert(headerSize == headerSizeEncoded);
140142

@@ -232,13 +234,13 @@ public static unsafe void CleanUpReliableDatagramBuffer(IQuicDatagramReliable dg
232234
pFirstBuf->Length = 0;
233235
}
234236

235-
private IMemoryOwner<byte> _reliableAckPacketBufferOwner;
237+
private IMemoryOwner<byte>? _reliableAckPacketBufferOwner;
236238
private Memory<byte> _reliableAckPacketBuffer;
237239

238240
private void WireUpInboundAcknowledgementStream()
239241
{
240242
Debug.Assert(InboundAcknowledgementStream is not null);
241-
InboundAcknowledgementStream.Name = "Inbound Reliable Acknowledgement Stream";
243+
InboundAcknowledgementStream!.Name = "Inbound Reliable Acknowledgement Stream";
242244
InboundAcknowledgementStream!.DataReceived += HandleInboundAcknowledgements;
243245
}
244246
private void HandleInboundAcknowledgements(QuicStream s)
@@ -280,7 +282,7 @@ private void HandleInboundAcknowledgements(QuicStream s)
280282
_reliableAckPacketBuffer = buffer.Slice(0, newSize);
281283
var prevOwner = _reliableAckPacketBufferOwner;
282284
_reliableAckPacketBufferOwner = owner;
283-
prevOwner.Dispose();
285+
prevOwner?.Dispose();
284286
savedNewDataAlready = true;
285287
var data = buffer.Span;
286288

@@ -332,7 +334,7 @@ private void HandleInboundAcknowledgements(QuicStream s)
332334
_reliableAckPacketBuffer = buffer.Slice(0, newSize);
333335
var prevOwner = _reliableAckPacketBufferOwner;
334336
_reliableAckPacketBufferOwner = owner;
335-
prevOwner.Dispose();
337+
prevOwner?.Dispose();
336338
}
337339
// save data for next packet
338340
}

StirlingLabs.MsQuic/QuicPeerConnection.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ public abstract partial class QuicPeerConnection : IDisposable
3333
static QuicPeerConnection()
3434
=> LogTimeStamp.Init();
3535

36-
protected nint _handle;
36+
private nint _handle;
3737

3838
private int _maxSendLength;
3939

4040
public unsafe QUIC_HANDLE* Handle
4141
{
42-
get => (QUIC_HANDLE*)_handle;
43-
protected set => _handle = (nint)value;
42+
get => (QUIC_HANDLE*)Interlocked.CompareExchange(ref _handle, default, default);
43+
protected set => Interlocked.Exchange(ref _handle, (nint)value);
4444
}
4545

4646
protected GCHandle GcHandle;
@@ -56,7 +56,11 @@ public unsafe QUIC_HANDLE* Handle
5656
public int QueuedIncomingDatagrams => _incomingDatagramsQueue.Count;
5757

5858
protected int RunState;
59+
60+
[SuppressMessage("ReSharper", "InconsistentNaming")]
5961
protected Memory<byte> _resumptionTicket;
62+
63+
[SuppressMessage("ReSharper", "InconsistentNaming")]
6064
protected Memory<byte> _resumptionState;
6165

6266
protected QuicPeerConnection(QuicRegistration registration, bool reliableDatagrams)
@@ -158,15 +162,11 @@ public unsafe void Shutdown(bool silent = false)
158162
public unsafe void Close()
159163
{
160164
if (Registration.Disposed) return;
161-
const nint zero = default;
162-
var handle = Interlocked.Exchange(ref _handle, zero);
163-
if (handle is zero) return;
164-
ThreadPoolHelpers.QueueUserWorkItemFast(&CloseInternal, (Registration, handle));
165+
var handle = (QUIC_HANDLE*)Interlocked.Exchange(ref _handle, default);
166+
if (handle == default(QUIC_HANDLE*)) return;
167+
Registration.Table.ConnectionClose(handle);
165168
}
166169

167-
private static unsafe void CloseInternal((QuicRegistration Registration, nint Handle) state)
168-
=> state.Registration.Table.ConnectionClose((QUIC_HANDLE*)state.Handle);
169-
170170

171171
public QuicDatagram SendDatagram(Memory<byte> data)
172172
{

StirlingLabs.MsQuic/QuicServerConnection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,5 +205,5 @@ protected override int DefaultCertificateReceivedStatus
205205
=> QUIC_STATUS_BAD_CERTIFICATE;
206206

207207
public override unsafe string ToString()
208-
=> Name is null ? $"[QuicServerConnection 0x{(ulong)_handle:X}]" : $"[QuicServerConnection \"{Name}\" 0x{(ulong)_handle:X}]";
208+
=> Name is null ? $"[QuicServerConnection 0x{(ulong)Handle:X}]" : $"[QuicServerConnection \"{Name}\" 0x{(ulong)Handle:X}]";
209209
}

0 commit comments

Comments
 (0)