#include "stdafx.h" #include "SessionPool.h" #include "Session.h" #include "SessionList.h" //================================================================================================== /** @remarks »ý¼ºÀÚ @param nSize Ç®ÀÌ ¼ö¿ëÇÒ ¼ö ÀÖ´Â ÀνºÅϽºÀÇ ÃÖ´ë °³¼ö */ //================================================================================================== SessionPool::SessionPool(DWORD max_size, DWORD send_buffer_size, DWORD recv_buffer_size, DWORD max_packet_size, DWORD timeout_tick, DWORD index_start, BOOL is_accept_socket) { max_size_ = 0; session_list_ = NULL; Create(max_size, send_buffer_size, recv_buffer_size, \ max_packet_size, timeout_tick, index_start, is_accept_socket); } //================================================================================================== /** @remarks ¼Ò¸êÀÚ */ //================================================================================================== SessionPool::~SessionPool() { if (session_list_) { module::TAllocator::DeAllocate(session_list_); session_list_ = NULL; } } //================================================================================================== /** @remarks ¼¼¼Ç Ç® »ý¼º @param dwSize »ý¼ºÇÒ ¼¼¼Ç °³¼ö */ //================================================================================================== void SessionPool::Create(DWORD max_size, DWORD send_buffer_size, DWORD recv_buffer_size, DWORD max_packet_size, DWORD timeout_tick, DWORD index_start, BOOL is_accept_socket) { max_size_ = max_size; // ¼¼¼Ç ¸®½ºÆ® »ý¼º session_list_ = module::TAllocator::Allocate(); for (DWORD i = 0; i < max_size; ++i) { // multi-arg TAllocator simulation Session* session = new (::malloc(sizeof(Session))) Session(\ send_buffer_size, recv_buffer_size, max_packet_size, timeout_tick); session->SetIndex(index_start + i); // if (is_accept_socket) { session->SetAcceptSocketFlag(); } session_list_->push_back(session); } } //================================================================================================== /** @remarks ¼¼¼Ç Ç®¿¡¼­ ¼¼¼ÇÀÇ Æ÷ÀÎÅ͸¦ ²¨³»¼­ ¸®ÅÏÇØÁØ´Ù. @retval Session* ¼¼¼Ç Ç®·ÎºÎÅÍ ÇÒ´ç ¹ÞÀº ¼¼¼ÇÀÇ Æ÷ÀÎÅÍ */ //================================================================================================== Session* SessionPool::Alloc() { session_list_->Lock(); // if (session_list_->empty()) { session_list_->Unlock(); return NULL; } // Session* session = session_list_->front(); session_list_->pop_front(); //printf("New ¼¼¼ÇÇ®(%x) ³²Àº ¼¼¼Ç(%d)\n", this, session_list_->size()); session_list_->Unlock(); return session; } //================================================================================================== /** @remarks »ç¿ëÇÏ´ø ¼¼¼ÇÀ» ¼¼¼Ç Ç®¿¡ ¹ÝȯÇÑ´Ù. @param session ¼¼¼Ç Ç®¿¡ ¹ÝȯÇÒ ¼¼¼ÇÀÇ Æ÷ÀÎÅÍ */ //================================================================================================== void SessionPool::Free(Session* session) { session_list_->Lock(); // assert(session_list_->size() < max_size_); session_list_->push_back(session); // session_list_->Unlock(); } //================================================================================================== /** @remarks ÇöÀç ¼¼¼Ç Ç®¿¡ ³²¾Æ ÀÖ´Â ¼¼¼ÇÀÇ °³¼ö¸¦ ¸®ÅÏÇÑ´Ù. (»ç¿ë °¡´ÉÇÑ ¼¼¼ÇÀÇ ¼ö) @retval int »ç¿ë °¡´ÉÇÑ ¼¼¼ÇÀÇ ¼ö */ //================================================================================================== int SessionPool::GetLength() { session_list_->Lock(); // int size = (int)(session_list_->size()); session_list_->Unlock(); // return size; }