Пример #1
0
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();
        }
    }
}
Пример #2
0
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;
}