10 #include "lldb/Host/Config.h"
12 #include "llvm/Config/llvm-config.h"
24 MainLoopWindows::MainLoopWindows() {
25 m_trigger_event = WSACreateEvent();
26 assert(m_trigger_event != WSA_INVALID_EVENT);
29 MainLoopWindows::~MainLoopWindows() {
30 assert(m_read_fds.empty());
31 BOOL result = WSACloseEvent(m_trigger_event);
32 assert(result == TRUE);
36 llvm::Expected<size_t> MainLoopWindows::Poll() {
37 std::vector<WSAEVENT> events;
38 events.reserve(m_read_fds.size() + 1);
39 for (
auto &[fd, info] : m_read_fds) {
40 int result = WSAEventSelect(fd, info.event, FD_READ | FD_ACCEPT | FD_CLOSE);
44 events.push_back(info.event);
46 events.push_back(m_trigger_event);
48 DWORD result = WSAWaitForMultipleEvents(events.size(), events.data(), FALSE,
51 for (
auto &fd : m_read_fds) {
52 int result = WSAEventSelect(fd.first, WSA_INVALID_EVENT, 0);
57 if (result >= WSA_WAIT_EVENT_0 && result <= WSA_WAIT_EVENT_0 + events.size())
58 return result - WSA_WAIT_EVENT_0;
60 return llvm::createStringError(llvm::inconvertibleErrorCode(),
61 "WSAWaitForMultipleEvents failed");
65 MainLoopWindows::RegisterReadObject(
const IOObjectSP &object_sp,
67 if (!object_sp || !object_sp->IsValid()) {
68 error.SetErrorString(
"IO object is not valid.");
71 if (object_sp->GetFdType() != IOObject::eFDTypeSocket) {
73 "MainLoopWindows: non-socket types unsupported on Windows");
77 WSAEVENT
event = WSACreateEvent();
78 if (event == WSA_INVALID_EVENT) {
79 error.SetErrorStringWithFormat(
"Cannot create monitoring event.");
85 .try_emplace(object_sp->GetWaitableHandle(),
FdInfo{event, callback})
89 error.SetErrorStringWithFormat(
"File descriptor %d already monitored.",
90 object_sp->GetWaitableHandle());
94 return CreateReadHandle(object_sp);
98 auto it = m_read_fds.find(handle);
99 assert(it != m_read_fds.end());
100 BOOL result = WSACloseEvent(it->second.event);
101 assert(result == TRUE);
103 m_read_fds.erase(it);
107 auto it = m_read_fds.find(handle);
108 if (it != m_read_fds.end())
109 it->second.callback(*
this);
113 m_terminate_request =
false;
118 while (!m_terminate_request && !m_read_fds.empty()) {
120 llvm::Expected<size_t> signaled_event = Poll();
122 return Status(signaled_event.takeError());
124 if (*signaled_event < m_read_fds.size()) {
125 auto &KV = *std::next(m_read_fds.begin(), *signaled_event);
126 ProcessReadObject(KV.first);
128 assert(*signaled_event == m_read_fds.size());
129 WSAResetEvent(m_trigger_event);
131 ProcessPendingCallbacks();
136 void MainLoopWindows::TriggerPendingCallbacks() {
137 WSASetEvent(m_trigger_event);