diff --git a/a8/tcplistener.h b/a8/tcplistener.h index 0722013..09caa3b 100644 --- a/a8/tcplistener.h +++ b/a8/tcplistener.h @@ -1,6 +1,8 @@ #ifndef A8_TCPLISTENER_H #define A8_TCPLISTENER_H +#include + namespace a8 { @@ -22,6 +24,7 @@ namespace a8 std::function on_error; std::string bind_address; unsigned short bind_port = 0; + std::atomic send_node_num = {0}; public: TcpListener(unsigned short max_client_cnt=0xEFFF); diff --git a/a8/tcpsession2.cc b/a8/tcpsession2.cc index 3bc7c6e..4e3c25c 100644 --- a/a8/tcpsession2.cc +++ b/a8/tcpsession2.cc @@ -136,6 +136,7 @@ namespace a8 } #endif send_buffer_mutex_.unlock(); + ++master->send_node_num; } } @@ -161,6 +162,7 @@ namespace a8 void TcpSession::Reset() { ClearSendBuff(); + ClearWorkBuff(); socket_ = -1; remote_address = ""; remote_port = 0; @@ -182,6 +184,7 @@ namespace a8 } Close(); ClearSendBuff(); + ClearWorkBuff(); } void TcpSession::_ForceClose() @@ -299,13 +302,10 @@ namespace a8 void TcpSession::ClearSendBuff() { a8::SendQueueNode* p_top_node_ = nullptr; - a8::SendQueueNode* p_work_node_ = nullptr; send_buffer_mutex_.lock(); p_top_node_ = top_node_; - p_work_node_ = work_node_; top_node_ = nullptr; bot_node_ = nullptr; - work_node_ = nullptr; send_buffer_mutex_.unlock(); a8::SendQueueNode *pdelnode = nullptr; @@ -316,14 +316,20 @@ namespace a8 free(pdelnode->buff); } free(pdelnode); + --master->send_node_num; } - while (p_work_node_) { - pdelnode = p_work_node_; - p_work_node_ = p_work_node_->next; + } + + void TcpSession::ClearWorkBuff() + { + while (work_node_) { + a8::SendQueueNode *pdelnode = work_node_; + work_node_ = work_node_->next; if (pdelnode->buff) { free(pdelnode->buff); } free(pdelnode); + --master->send_node_num; } } @@ -347,6 +353,7 @@ namespace a8 if (work_node_->sent_bytes >= work_node_->bufflen) { a8::SendQueueNode *pdelnode = work_node_; work_node_ = work_node_->next; + --master->send_node_num; if (!work_node_) { send_buffer_mutex_.lock(); if (top_node_) { diff --git a/a8/tcpsession2.h b/a8/tcpsession2.h index 3e954d5..ea029f0 100644 --- a/a8/tcpsession2.h +++ b/a8/tcpsession2.h @@ -52,6 +52,7 @@ namespace a8 private: void ClearSendBuff(); + void ClearWorkBuff(); void AsyncSend(); void NotifyEpollSend(); int DirectSend(a8::SendQueueNode* node);