--- innwebd/base_passive.cpp 2004/07/03 08:47:07 1.2 +++ innwebd/base_passive.cpp 2004/07/03 13:56:04 1.3 @@ -18,10 +18,9 @@ using namespace std; -UINT base_passive::uThreadCount = 0; +// UINT base_passive::uThreadCount = 0; base_passive::base_passive(void) -: p_ParentThread(NULL) { } @@ -103,6 +102,14 @@ int base_passive::work() if (this->load_priv() != 0) return -1; + this->p_ThreadPool = new thread_pool(MAX_CLIENT); + if (this->p_ThreadPool->GetLastError() != 0) + { + return -1; + } + + hThreadCurrent = GetCurrentThread(); + if (this->s_connect(this->w_address,this->w_port) == 0) { this->Startup(); @@ -117,11 +124,13 @@ int base_passive::work() continue; } - p->p_ParentThread = this; + p->SetParentThread(this); p->configure(this->innd_id,this->innd_name,this->innd_server,this->innd_uid,this->w_address,this->w_port,this->w_conn_str); this->running = true; + this->GetThreadPool()->SetThreadStatus(hThreadCurrent,thread_pool::S_WAITING); + namelen = sizeof(sin); if ((p->s = accept(this->s,(LPSOCKADDR)&sin,&namelen)) == INVALID_SOCKET) { @@ -132,6 +141,8 @@ int base_passive::work() return -2; } + this->GetThreadPool()->SetThreadStatus(hThreadCurrent,thread_pool::S_WORKING); + if (this->IsShutdown()) { break; @@ -157,11 +168,12 @@ int base_passive::work() delete(p); continue; } - if (base_passive::uThreadCount < MAX_CLIENT) + +// if (base_passive::uThreadCount < MAX_CLIENT) if (this->GetThreadPool()->GetThreadCount() < MAX_CLIENT) { if (hThreadCurrent = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)base_passive::AcceptThread,(LPVOID)p,0,&ulThreadId)) - base_passive::uThreadCount++; +// base_passive::uThreadCount++; CloseHandle(hThreadCurrent); syslog << logfile::log_head << "Create accept thread ... OK" << endl; } @@ -181,6 +193,8 @@ int base_passive::work() Sleep(1000*5); // Wait several seconds for all threads to exit } this->s_close(); + delete(this->p_ThreadPool); + this->unload_priv(); @@ -190,11 +204,20 @@ int base_passive::work() } DWORD base_passive::AcceptThread(LPVOID pParam) + HANDLE hThreadCurrent; { base_passive* p; try { + hThreadCurrent = GetCurrentThread(); + p = (base_passive*)pParam; + if (p->GetParentThread()->GetThreadPool()->AddThread(hThreadCurrent, CLOCKS_PER_SEC * 30) != 0) + if (p->GetParentThread()->GetThreadPool()->AddThread(GetCurrentThreadId(), CLOCKS_PER_SEC * 30) != 0) + { + syslog << logfile::log_head << "Register thread ... Failed" << endl; + p->GetParentThread()->GetThreadPool()->SetThreadStatus(hThreadCurrent,thread_pool::S_WORKING); + p->GetParentThread()->GetThreadPool()->SetThreadStatus(GetCurrentThreadId(),thread_pool::S_WORKING); if (p->db_env_init() == 0) { @@ -203,8 +226,14 @@ DWORD base_passive::AcceptThread(LPVOID else { syslog << logfile::log_head << "DB_ENV_INIT failed" << endl; + } + if (p->GetParentThread()->GetThreadPool()->RemoveThread(hThreadCurrent) != 0) + if (p->GetParentThread()->GetThreadPool()->RemoveThread(GetCurrentThreadId()) != 0) + { + syslog << logfile::log_head << "Unregister thread ... Failed" << endl; + } +// base_passive::uThreadCount--; - base_passive::uThreadCount--; delete(p); syslog << logfile::log_head << "Delete accept thread ... OK" << endl; }