This commit is contained in:
aozhiwei 2019-05-29 21:03:45 +08:00
parent b2d8c32b70
commit c0baee9980
3 changed files with 17 additions and 6 deletions

View File

@ -1,6 +1,8 @@
#ifndef A8_TCPLISTENER_H
#define A8_TCPLISTENER_H
#include <atomic>
namespace a8
{
@ -22,6 +24,7 @@ namespace a8
std::function<void (a8::TcpListener*, a8::TCPLISTENER_E, int)> on_error;
std::string bind_address;
unsigned short bind_port = 0;
std::atomic<long long> send_node_num = {0};
public:
TcpListener(unsigned short max_client_cnt=0xEFFF);

View File

@ -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_) {

View File

@ -52,6 +52,7 @@ namespace a8
private:
void ClearSendBuff();
void ClearWorkBuff();
void AsyncSend();
void NotifyEpollSend();
int DirectSend(a8::SendQueueNode* node);