| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| #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; |
| } |
|
|