--- innwebd/thread_pool.cpp 2004/07/03 13:55:42 1.3 +++ innwebd/thread_pool.cpp 2004/07/03 15:10:23 1.4 @@ -215,47 +215,48 @@ DWORD thread_pool::KillDeadThread(LPVOID { thread_pool *p; UINT i; - bool bKillStatus = true; + int t_count = 0; p = (thread_pool*)pParam; - if (p->SetLock(true) != 0) + while(!p->bTerminateThreadKiller) { - return p->uLastErrorCode; - } - - if (p->uThreadCount <= 0) - { - p->SetLock(false); - p->uLastErrorCode = E_THREAD_NOT_FOUND; - return E_THREAD_NOT_FOUND; - } - - for (i=0; i < p->uThreadMax; i++) - { - if ((p->uThreadStatusList[i] == S_WORKING) && - (clock() - p->time_status_set[i] > p->thread_timeout[i])) + if (t_count>=100) { - if (TerminateThread(p->hThreadList[i],-1)) - { - bKillStatus &= true; - syslog << logfile::log_head << "Terminate dead thread ... OK" << endl; - } - else + t_count=0; + + if (p->SetLock(true) == 0) { - bKillStatus &= false; - syslog << logfile::log_head << "Terminate dead thread ... Failed" << endl; + for (i=0; i < p->uThreadMax; i++) + { + if ((p->hThreadList[i] != NULL) && + (p->uThreadStatusList[i] == S_WORKING) && + (clock() - p->time_status_set[i] > p->thread_timeout[i])) + { + if (TerminateThread(p->hThreadList[i],-1)) + { + syslog << logfile::log_head << "Terminate dead thread ... OK" << endl; + } + else + { + syslog << logfile::log_head << "Terminate dead thread ... Failed" << endl; + } + p->hThreadList[i] = NULL; + p->uThreadStatusList[i] = S_UNUSED; + p->time_status_set[i] = clock(); + p->uThreadCount--; + } + } } - p->hThreadList[i] = NULL; - p->uThreadStatusList[i] = S_UNUSED; - p->time_status_set[i] = clock(); - p->uThreadCount--; + + p->SetLock(false); } + + Sleep(100); + t_count++; } - p->SetLock(false); - p->uLastErrorCode = (bKillStatus?E_NOERROR:E_KILL_THREAD_FAILED); - return (bKillStatus?E_NOERROR:E_KILL_THREAD_FAILED); + return (E_NOERROR); } int thread_pool::GetThreadCount(void) const @@ -267,6 +268,8 @@ int thread_pool::EnableKillDeadThread(vo { HANDLE hThreadCurrent; ULONG ulThreadId; + + this->bTerminateThreadKiller = false; if (hThreadCurrent = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)thread_pool::KillDeadThread,(LPVOID)this,0,&ulThreadId)) { this->hThreadKiller = hThreadCurrent; @@ -283,7 +286,16 @@ int thread_pool::EnableKillDeadThread(vo int thread_pool::DisableKillDeadThread(void) { - if (this->hThreadKiller) + bTerminateThreadKiller = true; + + Sleep(1000); + + if (!bTerminateThreadKiller) + { + syslog << logfile::log_head << "Terminate killer thread ... OK" << endl; + } + + if (bTerminateThreadKiller && this->hThreadKiller) { if (TerminateThread(this->hThreadKiller,0)) {