void Socket::processingLoop() { while (connected) { std::unique_lock<std::mutex> lock(processingMutex); while (connected && processingQueue.empty()) processingCondition.wait(lock); if (connected) { char *buffer = processingQueue.back(); processingQueue.pop_back(); lock.unlock(); std::unique_lock<std::mutex> handlerLock(handlerSwapMutex); while (handlerSwapping) handlerSwapProcessingCondition.wait(handlerLock); handlerLock.unlock(); activeProcessingCount++; processMessage(buffer); free(buffer); activeProcessingCount--; handlerSwapCondition.notify_all(); } else { lock.unlock(); } } }
DWORD ConsoleHandler::MonitorThread() { // resume ConsoleHook's thread m_consoleParams.SetRespEvent(); HANDLE arrWaitHandles[] = { m_hConsoleProcess.get(), m_hMonitorThreadExit.get(), m_consoleBuffer.GetReqEvent() }; while (::WaitForMultipleObjects(sizeof(arrWaitHandles)/sizeof(arrWaitHandles[0]), arrWaitHandles, FALSE, INFINITE) > WAIT_OBJECT_0 + 1) { DWORD dwColumns = m_consoleInfo->csbi.srWindow.Right - m_consoleInfo->csbi.srWindow.Left + 1; DWORD dwRows = m_consoleInfo->csbi.srWindow.Bottom - m_consoleInfo->csbi.srWindow.Top + 1; DWORD dwBufferColumns = m_consoleInfo->csbi.dwSize.X; DWORD dwBufferRows = m_consoleInfo->csbi.dwSize.Y; bool bResize = false; if ((m_consoleParams->dwColumns != dwColumns) || (m_consoleParams->dwRows != dwRows) || ((m_consoleParams->dwBufferColumns != 0) && (m_consoleParams->dwBufferColumns != dwBufferColumns)) || ((m_consoleParams->dwBufferRows != 0) && (m_consoleParams->dwBufferRows != dwBufferRows))) { MutexLock handlerLock(m_bufferMutex); m_consoleParams->dwColumns = dwColumns; m_consoleParams->dwRows = dwRows; // TODO: improve this // this will handle console applications that change console buffer // size (like Far manager). // This is not a perfect solution, but it's the best one I have // for now if (m_consoleParams->dwBufferColumns != 0) m_consoleParams->dwBufferColumns= dwBufferColumns; if (m_consoleParams->dwBufferRows != 0) m_consoleParams->dwBufferRows = dwBufferRows; bResize = true; } m_consoleChangeDelegate(bResize); } TRACE(L"exiting thread\n"); // exiting thread m_consoleCloseDelegate(); return 0; }