a8/a8/tcpsessionpool.cc
2019-07-01 09:58:16 +08:00

92 lines
2.2 KiB
C++

#include <time.h>
#include <a8/a8.h>
#include <a8/tcpsession.h>
#include <a8/tcpsessionpool.h>
namespace a8
{
struct TcpSessionPool::TcpSessionNode
{
a8::TcpSession* session = nullptr;
time_t addtime = 0;
a8::TcpSessionPool::TcpSessionNode* next = nullptr;
};
TcpSessionPool::TcpSessionPool()
{
}
TcpSessionPool::~TcpSessionPool()
{
a8::TcpSessionPool::TcpSessionNode *pdelnode = top_node_;
while (top_node_) {
pdelnode = top_node_;
top_node_ = top_node_->next;
pdelnode->session->Destory();
delete pdelnode->session;
delete pdelnode;
}
}
void TcpSessionPool::Add(a8::TcpSession* session)
{
a8::TcpSessionPool::TcpSessionNode *p = new a8::TcpSessionPool::TcpSessionNode();
p->session = session;
p->addtime = time(nullptr);
if (bot_node_) {
bot_node_->next = p;
bot_node_ = p;
}else{
top_node_ = p;
bot_node_ = p;
}
count_++;
}
a8::TcpSession* TcpSessionPool::Get()
{
ClearTimeOutSocket();
a8::TcpSession* p = nullptr;
if (top_node_) {
if (time(nullptr) - top_node_->addtime >= 30) {
p = top_node_->session;
a8::TcpSessionPool::TcpSessionNode* pdelnode = top_node_;
top_node_ = top_node_->next;
if (!top_node_) {
bot_node_ = nullptr;
}
delete pdelnode;
count_--;
}
}
return p;
}
void TcpSessionPool::ClearTimeOutSocket()
{
while (top_node_) {
if(time(nullptr) - top_node_->addtime > 60 * 5){
a8::TcpSessionPool::TcpSessionNode* pdelnode = top_node_;
top_node_ = top_node_->next;
if (!top_node_) {
bot_node_ = NULL;
}
delete pdelnode->session;
delete pdelnode;
count_--;
}else{
break;
}
}
}
int TcpSessionPool::Count()
{
return count_;
}
}