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