DWORD WINAPI CompletionPortStackListener::WorkerThread(LPVOID obj) { CompletionPortStackListener* instance = (CompletionPortStackListener*)obj; int loopCtr1 = 0; stack<Structs::LP_JOBREQUEST> _jobList = instance->jobList; SOCKET _socket; while (true) { ::WaitForSingleObject(instance->ghHasMessageEvent, INFINITE); ::WaitForSingleObject(instance->ghMutex, INFINITE); loopCtr1++; ::WaitForSingleObject(instance->ghMutex, INFINITE); int sz = instance->jobList.size(); if (sz > 0) { ::WaitForSingleObject(instance->ghMutex2, INFINITE); Structs::LP_JOBREQUEST job = instance->jobList.top(); instance->jobList.pop(); ::ReleaseMutex(instance->ghMutex2); // // if (job == NULL) { continue; } _socket = job->socket; { try { Protocol* p = instance->_protocol; //*itr; if (p == NULL) { continue; } Structs::LP_JOBREQUEST jobresp = new Structs::JOBREQUEST(); jobresp->data = job->data; jobresp->len = job->len; jobresp->socket = job->socket; p->AddMessage(_strdup(jobresp->data)); LPVOID res = p->Parse(); Structs::LP_JOBREQUEST nextJob = (Structs::LP_JOBREQUEST)p->Next(); if (nextJob != NULL) { nextJob->socket = jobresp->socket; instance->inputStage->AddMessage(nextJob); } if (job != NULL) { //ZeroMemory(job, sizeof(Structs::JOBREQUEST)); //delete(job); } } catch (...) { int x = 1; } } } if (instance->jobList.size() == 0) { ::ResetEvent(instance->ghHasMessageEvent); } ::ReleaseMutex(instance->ghMutex); } return 1; }