int IOCP_Destroy(IOCP* iocp) { HANDLE curThread = NULL; int i = 0; if(iocp->hThreads) { curThread = GetCurrentThread(); for(i = 0; i < iocp->threads; ++i) { if(curThread == iocp->hThreads[i]) return IOCP_DESTROYFAILED; } } iocp->inited = FALSE; if(iocp->hThreads) { if(iocp->iocpHandle) { for(i = 0; i < iocp->threads; ++i){ PostQueuedCompletionStatus(iocp->iocpHandle, 0, (ULONG_PTR)NULL, NULL); } } for(i = 0; i < iocp->threads; ++i) { if( iocp->hThreads[i] ) { WaitForSingleObject(iocp->hThreads[i], INFINITE); CloseHandle(iocp->hThreads[i]); } } xFree(iocp->hThreads); } iocp->hThreads = NULL; iocp->threads = 0; if(iocp->iocpHandle) { if(!CloseHandle(iocp->iocpHandle)){ } iocp->iocpHandle = NULL; } TimerQueue_Destory(&iocp->timerQueue); Map_Foreach(iocp->contextMap, IOCP_ContextHandler); Map_Delete(iocp->contextMap); LockPool_Destroy(&iocp->lockPool); DeleteCriticalSection(&iocp->cs); return IOCP_SUCESS; }
void* _client_monitor(void* arg) { AVOID_NOUSED(arg); client_iterator_t iterator; iterator.clients_tobe_clear = Queue_Init(sizeof(int)); for(;;) { int interval = 0; WRLock_LockR(g_executor.conf_lock_); interval = g_executor.pluse_interval_; WRLock_UnlockR(g_executor.conf_lock_); iterator.pluse_interval = interval; iterator.check_time = time(NULL); Map_Foreach(g_executor.clients , _foreach_client_ , &iterator); int cfd; while(Queue_Pop(iterator.clients_tobe_clear , &cfd) == QUEUE_OK) { _release_client(cfd , RELEASE_BY_PLUSE); } sleep(interval); } return NULL; }