99#include " lldb/Host/windows/MainLoopWindows.h"
1010#include " lldb/Host/Config.h"
1111#include " lldb/Host/Socket.h"
12+ #include " lldb/Host/windows/windows.h"
1213#include " lldb/Utility/Status.h"
1314#include " llvm/Config/llvm-config.h"
1415#include " llvm/Support/Casting.h"
1819#include < cerrno>
1920#include < csignal>
2021#include < ctime>
22+ #include < io.h>
23+ #include < thread>
2124#include < vector>
2225#include < winsock2.h>
2326
@@ -39,9 +42,8 @@ namespace {
3942class PipeEvent : public MainLoopWindows ::IOEvent {
4043public:
4144 explicit PipeEvent (HANDLE handle)
42- : IOEvent((IOObject::WaitableHandle)CreateEventW(
43- NULL , /* bManualReset=*/ FALSE ,
44- /* bInitialState=*/ FALSE , NULL )),
45+ : IOEvent(CreateEventW(NULL , /* bManualReset=*/ FALSE ,
46+ /* bInitialState=*/ FALSE , NULL )),
4547 m_handle(handle), m_ready(CreateEventW(NULL , /* bManualReset=*/ FALSE ,
4648 /* bInitialState=*/ FALSE , NULL )) {
4749 assert (m_event && m_ready);
@@ -53,12 +55,12 @@ class PipeEvent : public MainLoopWindows::IOEvent {
5355 SetEvent (m_ready);
5456 // Keep trying to cancel ReadFile() until the thread exits.
5557 do {
56- CancelIoEx ((HANDLE) m_handle, /* lpOverlapped=*/ NULL );
58+ CancelIoEx (m_handle, /* lpOverlapped=*/ NULL );
5759 } while (WaitForSingleObject (m_monitor_thread.native_handle (), 1 ) ==
5860 WAIT_TIMEOUT);
5961 m_monitor_thread.join ();
6062 }
61- CloseHandle ((HANDLE) m_event);
63+ CloseHandle (m_event);
6264 CloseHandle (m_ready);
6365 }
6466
@@ -107,7 +109,7 @@ class PipeEvent : public MainLoopWindows::IOEvent {
107109 continue ;
108110 }
109111
110- SetEvent ((HANDLE) m_event);
112+ SetEvent (m_event);
111113
112114 // Wait until the current read is consumed before doing the next read.
113115 WaitForSingleObject (m_ready, INFINITE);
@@ -124,15 +126,15 @@ class PipeEvent : public MainLoopWindows::IOEvent {
124126class SocketEvent : public MainLoopWindows ::IOEvent {
125127public:
126128 explicit SocketEvent (SOCKET socket)
127- : IOEvent((IOObject::WaitableHandle) WSACreateEvent()), m_socket(socket) {
129+ : IOEvent(WSACreateEvent()), m_socket(socket) {
128130 assert (m_event != WSA_INVALID_EVENT);
129131 }
130132
131- ~SocketEvent () override { WSACloseEvent ((HANDLE) m_event); }
133+ ~SocketEvent () override { WSACloseEvent (m_event); }
132134
133135 void WillPoll () {
134- int result = WSAEventSelect (m_socket, (HANDLE)m_event,
135- FD_READ | FD_ACCEPT | FD_CLOSE);
136+ int result =
137+ WSAEventSelect (m_socket, m_event, FD_READ | FD_ACCEPT | FD_CLOSE);
136138 assert (result == 0 );
137139 UNUSED_IF_ASSERT_DISABLED (result);
138140 }
@@ -143,7 +145,7 @@ class SocketEvent : public MainLoopWindows::IOEvent {
143145 UNUSED_IF_ASSERT_DISABLED (result);
144146 }
145147
146- void Disarm () override { WSAResetEvent ((HANDLE) m_event); }
148+ void Disarm () override { WSAResetEvent (m_event); }
147149
148150 SOCKET m_socket;
149151};
@@ -167,7 +169,7 @@ llvm::Expected<size_t> MainLoopWindows::Poll() {
167169 events.reserve (m_read_fds.size () + 1 );
168170 for (auto &[_, fd_info] : m_read_fds) {
169171 fd_info.event ->WillPoll ();
170- events.push_back ((HANDLE) fd_info.event ->GetHandle ());
172+ events.push_back (fd_info.event ->GetHandle ());
171173 }
172174 events.push_back (m_interrupt_event);
173175
@@ -206,16 +208,21 @@ MainLoopWindows::RegisterReadObject(const IOObjectSP &object_sp,
206208 return nullptr ;
207209 }
208210
209- if (object_sp->GetFdType () == IOObject::eFDTypeSocket)
211+ if (object_sp->GetFdType () == IOObject::eFDTypeSocket) {
210212 m_read_fds[waitable_handle] = {
211- std::make_unique<SocketEvent>((SOCKET)waitable_handle), callback};
212- else if (GetFileType (waitable_handle) == FILE_TYPE_PIPE)
213- m_read_fds[waitable_handle] = {
214- std::make_unique<PipeEvent>((HANDLE)waitable_handle), callback};
215- else {
216- error = Status::FromErrorStringWithFormat (" Unsupported file type %d" ,
217- GetFileType (waitable_handle));
218- return nullptr ;
213+ std::make_unique<SocketEvent>(
214+ reinterpret_cast <SOCKET>(waitable_handle)),
215+ callback};
216+ } else {
217+ DWORD file_type = GetFileType (waitable_handle);
218+ if (file_type != FILE_TYPE_PIPE) {
219+ error = Status::FromErrorStringWithFormat (" Unsupported file type %d" ,
220+ file_type);
221+ return nullptr ;
222+ }
223+
224+ m_read_fds[waitable_handle] = {std::make_unique<PipeEvent>(waitable_handle),
225+ callback};
219226 }
220227
221228 return CreateReadHandle (object_sp);
0 commit comments