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); }
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 RemoveStateFlag(SocketState.InSending); return; } } if (IsInClosingOrClosed) { RemoveStateFlag(SocketState.InSending); return; } SendingQueue newQueue; if (!m_SendingQueuePool.TryGet(out newQueue)) { AppSession.Logger.Error("There is no enougth sending queue can be used."); RemoveStateFlag(SocketState.InSending); this.Close(CloseReason.InternalError); return; } var oldQueue = Interlocked.CompareExchange(ref m_SendingQueue, newQueue, queue); if (!ReferenceEquals(oldQueue, queue)) { if (newQueue != null) m_SendingQueuePool.Push(newQueue); RemoveStateFlag(SocketState.InSending); if (!IsInClosingOrClosed) { 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.Push(queue); RemoveStateFlag(SocketState.InSending); this.Close(CloseReason.InternalError); return; } Send(queue); }
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); }
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 RemoveStateFlag(SocketState.InSending); return; } } if (IsInClosingOrClosed) { return; } SendingQueue newQueue; if (!m_SendingQueuePool.TryGet(out newQueue)) { AppSession.Logger.Error("There is no enougth sending queue can be used."); this.Close(CloseReason.InternalError); return; } var oldQueue = Interlocked.CompareExchange(ref m_SendingQueue, newQueue, queue); if (!ReferenceEquals(oldQueue, queue)) { if (newQueue != null) { m_SendingQueuePool.Push(newQueue); } RemoveStateFlag(SocketState.InSending); if (!IsInClosingOrClosed) { 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.Push(queue); RemoveStateFlag(SocketState.InSending); this.Close(CloseReason.InternalError); return; } Send(queue); }