private PreallocatedChannelData CreateChannelData() { PreallocatedChannelData channelData = new PreallocatedChannelData(); channelData.InitReceiver(bufferManager); channelData.InitSender(bufferManager); return(channelData); }
private void OnServerAcceptorAccepted(object sender, SocketEventArgs e) { PreallocatedChannelData channelResources = GetChannelData(); ISocketChannel channel = new ImmutableChannel(e.Socket, channelResources.Receiver, channelResources.Sender, channelResources.ReceiverArgs, channelResources.SenderWriter, channelResources); channel.Closed += OnChannelClosed; RaiseConnected(channel); channel.Start(); }
private void OnChannelClosed(object sender, EventArgs e) { if (channelDataPool != null) { PreallocatedChannelData channelResources = (PreallocatedChannelData)((ImmutableChannel)sender).AdditionalData; channelDataPool.PutObject(channelResources); } else if (state == (int)ServerState.Stopped) // perform expensive ter down only if server doesn't listen anymore { // this way you can stop listener and then close all the channels to free resources PreallocatedChannelData channelResources = (PreallocatedChannelData)((ImmutableChannel)sender).AdditionalData; channelResources.Receiver.TearDown(false); channelResources.Sender.TearDown(); } serverAcceptor.ReleaseOpenConnectionSlot(); }