|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "EventLoop.h" |
|
|
|
#include <algorithm> |
|
|
|
#include "NamedPipe.h" |
|
#include "../shared/DebugClient.h" |
|
#include "../shared/WinptyAssert.h" |
|
|
|
EventLoop::~EventLoop() { |
|
for (NamedPipe *pipe : m_pipes) { |
|
delete pipe; |
|
} |
|
m_pipes.clear(); |
|
} |
|
|
|
|
|
void EventLoop::run() |
|
{ |
|
std::vector<HANDLE> waitHandles; |
|
DWORD lastTime = GetTickCount(); |
|
while (!m_exiting) { |
|
bool didSomething = false; |
|
|
|
|
|
waitHandles.clear(); |
|
for (size_t i = 0; i < m_pipes.size(); ++i) { |
|
if (m_pipes[i]->serviceIo(&waitHandles)) { |
|
onPipeIo(*m_pipes[i]); |
|
didSomething = true; |
|
} |
|
} |
|
|
|
|
|
if (m_pollInterval > 0) { |
|
int elapsed = GetTickCount() - lastTime; |
|
if (elapsed >= m_pollInterval) { |
|
onPollTimeout(); |
|
lastTime = GetTickCount(); |
|
didSomething = true; |
|
} |
|
} |
|
|
|
if (didSomething) |
|
continue; |
|
|
|
|
|
DWORD timeout = INFINITE; |
|
if (m_pollInterval > 0) |
|
timeout = std::max(0, (int)(lastTime + m_pollInterval - GetTickCount())); |
|
if (waitHandles.size() == 0) { |
|
ASSERT(timeout != INFINITE); |
|
if (timeout > 0) |
|
Sleep(timeout); |
|
} else { |
|
DWORD result = WaitForMultipleObjects(waitHandles.size(), |
|
waitHandles.data(), |
|
FALSE, |
|
timeout); |
|
ASSERT(result != WAIT_FAILED); |
|
} |
|
} |
|
} |
|
|
|
NamedPipe &EventLoop::createNamedPipe() |
|
{ |
|
NamedPipe *ret = new NamedPipe(); |
|
m_pipes.push_back(ret); |
|
return *ret; |
|
} |
|
|
|
void EventLoop::setPollInterval(int ms) |
|
{ |
|
m_pollInterval = ms; |
|
} |
|
|
|
void EventLoop::shutdown() |
|
{ |
|
m_exiting = true; |
|
} |
|
|