Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}