// inbound. internal MsQuicStream(MsQuicConnection.State connectionState, SafeMsQuicStreamHandle streamHandle, QUIC_STREAM_OPEN_FLAGS flags) { _state.Handle = streamHandle; _state.ConnectionState = connectionState; _canRead = true; _canWrite = !flags.HasFlag(QUIC_STREAM_OPEN_FLAGS.UNIDIRECTIONAL); _started = true; _stateHandle = GCHandle.Alloc(_state); try { MsQuicApi.Api.SetCallbackHandlerDelegate( _state.Handle, s_streamDelegate, GCHandle.ToIntPtr(_stateHandle)); } catch { _stateHandle.Free(); throw; } if (NetEventSource.Log.IsEnabled()) { NetEventSource.Info( _state, $"[Stream#{_state.GetHashCode()}] inbound {(_canWrite ? "bi" : "uni")}directional stream created " + $"in Connection#{_state.ConnectionState.GetHashCode()}."); } }
private static uint HandleEventNewStream(State state, ref ConnectionEvent connectionEvent) { var streamHandle = new SafeMsQuicStreamHandle(connectionEvent.Data.PeerStreamStarted.Stream); var stream = new MsQuicStream(streamHandle, connectionEvent.Data.PeerStreamStarted.Flags); state.AcceptQueue.Writer.TryWrite(stream); return(MsQuicStatusCodes.Success); }
private static uint HandleEventNewStream(State state, ref ConnectionEvent connectionEvent) { var streamHandle = new SafeMsQuicStreamHandle(connectionEvent.Data.PeerStreamStarted.Stream); if (!state.TryQueueNewStream(streamHandle, connectionEvent.Data.PeerStreamStarted.Flags)) { // This will call StreamCloseDelegate and free the stream. // We will return Success to the MsQuic to prevent double free. streamHandle.Dispose(); } return(MsQuicStatusCodes.Success); }
private static unsafe int HandleEventNewStream(State state, ref QUIC_CONNECTION_EVENT connectionEvent) { var streamHandle = new SafeMsQuicStreamHandle(connectionEvent.PEER_STREAM_STARTED.Stream); if (!state.TryQueueNewStream(streamHandle, connectionEvent.PEER_STREAM_STARTED.Flags)) { // This will call StreamCloseDelegate and free the stream. // We will return Success to the MsQuic to prevent double free. streamHandle.Dispose(); } return(QUIC_STATUS_SUCCESS); }
public bool TryQueueNewStream(SafeMsQuicStreamHandle streamHandle, QUIC_STREAM_OPEN_FLAGS flags) { var stream = new MsQuicStream(this, streamHandle, flags); if (AcceptQueue.Writer.TryWrite(stream)) { return(true); } else { stream.Dispose(); return(false); } }
// inbound. internal MsQuicStream(SafeMsQuicStreamHandle streamHandle, QUIC_STREAM_OPEN_FLAGS flags) { _state.Handle = streamHandle; _canRead = true; _canWrite = !flags.HasFlag(QUIC_STREAM_OPEN_FLAGS.UNIDIRECTIONAL); _started = true; _stateHandle = GCHandle.Alloc(_state); try { MsQuicApi.Api.SetCallbackHandlerDelegate( _state.Handle, s_streamDelegate, GCHandle.ToIntPtr(_stateHandle)); } catch { _stateHandle.Free(); throw; } }