diff --git a/lldb/source/Host/common/MainLoop.cpp b/lldb/source/Host/common/MainLoop.cpp --- a/lldb/source/Host/common/MainLoop.cpp +++ b/lldb/source/Host/common/MainLoop.cpp @@ -69,6 +69,67 @@ } #endif +#ifdef _WIN32 +class MainLoop::RunImpl { +public: + RunImpl(MainLoop &loop); + ~RunImpl(); + + Status Poll(); + + void ProcessEvents(); + +private: + MainLoop &loop; + llvm::Optional signaled_event; +}; + +MainLoop::RunImpl::RunImpl(MainLoop &loop) : loop(loop) { +} + +MainLoop::RunImpl::~RunImpl() { +} + +Status MainLoop::RunImpl::Poll() { + std::vector read_events; + read_events.reserve(loop.m_read_fds.size()); + for(auto &fd : loop.m_read_fds) { + WSAEVENT event = WSACreateEvent(); + assert(event != WSA_INVALID_EVENT); + + int result = WSAEventSelect(fd.first, event, FD_READ | FD_ACCEPT | FD_CLOSE); + assert(result == 0); + + read_events.push_back(event); + } + + DWORD result = WSAWaitForMultipleEvents(read_events.size(), + read_events.data(), FALSE, WSA_INFINITE, FALSE); + + for(auto &fd : loop.m_read_fds) { + int result = WSAEventSelect(fd.first, WSA_INVALID_EVENT, 0); + assert(result == 0); + } + + for (auto &event: read_events) { + BOOL result = WSACloseEvent(event); + assert(result == TRUE); + } + + if (result >= WSA_WAIT_EVENT_0 && result < WSA_WAIT_EVENT_0 + read_events.size()) { + signaled_event = result - WSA_WAIT_EVENT_0; + return Status(); + } + return Status("WSAWaitForMultipleEvents failed"); +} + +void MainLoop::RunImpl::ProcessEvents() { + assert(signaled_event); + auto &fd_info = *std::next(loop.m_read_fds.begin(), *signaled_event); + + loop.ProcessReadObject(fd_info.first); +} +#else class MainLoop::RunImpl { public: RunImpl(MainLoop &loop); @@ -254,6 +315,7 @@ } } #endif +#endif MainLoop::MainLoop() : m_terminate_request(false) { #if HAVE_SYS_EVENT_H