// inbound.
internal MsQuicStream(MsQuicConnection.State connectionState, SafeMsQuicStreamHandle streamHandle, QUIC_STREAM_OPEN_FLAGS flags)
{
+ if (!connectionState.TryAddStream(this))
+ {
+ throw new ObjectDisposedException(nameof(QuicConnection));
+ }
+ // this assignment should be done before SetCallbackHandlerDelegate to prevent NRE in HandleEventConnectionClose
+ // but after TryAddStream to prevent unnecessary RemoveStream in finalizer
+ _state.ConnectionState = connectionState;
+
_state.Handle = streamHandle;
_canRead = true;
_canWrite = !flags.HasFlag(QUIC_STREAM_OPEN_FLAGS.UNIDIRECTIONAL);
throw;
}
- if (!connectionState.TryAddStream(this))
- {
- _state.StateGCHandle.Free();
- throw new ObjectDisposedException(nameof(QuicConnection));
- }
-
- _state.ConnectionState = connectionState;
-
_state.TraceId = MsQuicTraceHelper.GetTraceId(_state.Handle);
if (NetEventSource.Log.IsEnabled())
{
{
Debug.Assert(connectionState.Handle != null);
+ if (!connectionState.TryAddStream(this))
+ {
+ throw new ObjectDisposedException(nameof(QuicConnection));
+ }
+ // this assignment should be done before StreamOpenDelegate to prevent NRE in HandleEventConnectionClose
+ // but after TryAddStream to prevent unnecessary RemoveStream in finalizer
+ _state.ConnectionState = connectionState;
+
_canRead = !flags.HasFlag(QUIC_STREAM_OPEN_FLAGS.UNIDIRECTIONAL);
_canWrite = true;
throw;
}
- if (!connectionState.TryAddStream(this))
- {
- _state.Handle?.Dispose();
- _state.StateGCHandle.Free();
- throw new ObjectDisposedException(nameof(QuicConnection));
- }
-
- _state.ConnectionState = connectionState;
-
_state.TraceId = MsQuicTraceHelper.GetTraceId(_state.Handle);
if (NetEventSource.Log.IsEnabled())
{