Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ internal sealed class State

// These exists to prevent GC of the MsQuicConnection in the middle of an async op (Connect or Shutdown).
public MsQuicConnection? Connection;
public bool ShutdownInProgress;

public readonly ValueTaskSource ConnectTcs = new ValueTaskSource();
// TODO: only allocate these when there is an outstanding shutdown.
Expand Down Expand Up @@ -215,7 +216,10 @@ private static unsafe int HandleEventConnected(State state, ref QUIC_CONNECTION_
//state.Connection._remoteEndPoint = MsQuicParameterHelpers.GetIPEndPointParam(MsQuicApi.Api, state.Handle, QUIC_PARAM_CONN_REMOTE_ADDRESS);
state.Connection._localEndPoint = MsQuicParameterHelpers.GetIPEndPointParam(MsQuicApi.Api, state.Handle, QUIC_PARAM_CONN_LOCAL_ADDRESS);
state.Connection._negotiatedAlpnProtocol = new SslApplicationProtocol(new Span<byte>(connectionEvent.CONNECTED.NegotiatedAlpn, connectionEvent.CONNECTED.NegotiatedAlpnLength).ToArray());
state.Connection = null;
if (!state.ShutdownInProgress)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

do we actually need this or can we wait for the final event from msquic?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not anymore, since I removed the only assert checking it's null.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm fine with moving forward to avoid CI failures if you have better fix in pipeline....

{
state.Connection = null;
}

state.ConnectTcs.TrySetResult();

Expand All @@ -227,7 +231,10 @@ private static int HandleEventShutdownInitiatedByTransport(State state, ref QUIC
if (!state.ConnectTcs.IsCompleted)
{
Debug.Assert(state.Connection != null);
state.Connection = null;
if (!state.ShutdownInProgress)
{
state.Connection = null;
}

state.ConnectTcs.TrySetException(new MsQuicException(connectionEvent.SHUTDOWN_INITIATED_BY_TRANSPORT.Status, "Connection has been shutdown by transport"));
}
Expand All @@ -254,6 +261,7 @@ private static int HandleEventShutdownComplete(State state, ref QUIC_CONNECTION_
state.StateGCHandle.Free();

state.Connection = null;
state.ShutdownInProgress = false;

state.ShutdownTcs.SetResult(QUIC_STATUS_SUCCESS);

Expand Down Expand Up @@ -595,7 +603,7 @@ private unsafe ValueTask ShutdownAsync(
long ErrorCode)
{
// Store the connection into the GCHandle'd state to prevent GC if user calls ShutdownAsync and gets rid of all references to the MsQuicConnection.
Debug.Assert(_state.Connection == null);
_state.ShutdownInProgress = true;
_state.Connection = this;

try
Expand All @@ -608,6 +616,7 @@ private unsafe ValueTask ShutdownAsync(
}
catch
{
_state.ShutdownInProgress = false;
_state.Connection = null;
throw;
}
Expand Down