92 lines
2.2 KiB
C++
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_;
|
|
}
|
|
|
|
}
|