public virtual void Initialize(IAppSession appSession) { AppSession = appSession; DataProcessor = appSession.CreatePipelineProcessor(); Config = appSession.Config; SyncSend = Config.SyncSend; m_SendingQueuePool = ((SocketServerBase)((ISocketServerAccessor)appSession.AppServer).SocketServer).SendingQueuePool; SendingQueue queue = m_SendingQueuePool.Get(); m_SendingQueue = queue; queue.StartEnqueue(); }
private void StartSend(SendingQueue queue, int sendingTrackID, bool initial) { if (initial) { if (!TryAddStateFlag(SocketState.InSending)) { return; } var currentQueue = m_SendingQueue; if (currentQueue != queue || sendingTrackID != currentQueue.TrackID) { //Has been sent OnSendEnd(); return; } } Socket client; if (IsInClosingOrClosed && TryValidateClosedBySocket(out client)) { OnSendEnd(true); return; } SendingQueue newQueue = m_SendingQueuePool.Get(); var oldQueue = Interlocked.CompareExchange(ref m_SendingQueue, newQueue, queue); if (!ReferenceEquals(oldQueue, queue)) { if (newQueue != null) { m_SendingQueuePool.Return(newQueue); } if (IsInClosingOrClosed) { OnSendEnd(true); } else { OnSendEnd(false); AppSession.Logger.Error("Failed to switch the sending queue."); this.Close(CloseReason.InternalError); } return; } //Start to allow enqueue newQueue.StartEnqueue(); queue.StopEnqueue(); if (queue.Count == 0) { AppSession.Logger.Error("There is no data to be sent in the queue."); m_SendingQueuePool.Return(queue); OnSendEnd(false); this.Close(CloseReason.InternalError); return; } Send(queue); }