10 #include "lldb/Host/Config.h"
13 #include "llvm/Config/llvm-config.h"
14 #include "llvm/Support/Errno.h"
28 #include <sys/event.h>
29 #elif defined(__ANDROID__)
30 #include <sys/syscall.h>
57 std::vector<struct kevent> in_events;
58 struct kevent out_events[4];
68 sigset_t get_sigmask();
81 EV_SET(&in_events[i++], fd.first, EVFILT_READ, EV_ADD, 0, 0, 0);
83 num_events = kevent(loop.m_kqueue, in_events.data(), in_events.size(),
84 out_events, std::size(out_events),
nullptr);
98 assert(num_events >= 0);
99 for (
int i = 0; i < num_events; ++i) {
102 switch (out_events[i].filter) {
110 llvm_unreachable(
"Unknown event");
123 int ret = pthread_sigmask(SIG_SETMASK,
nullptr, &sigmask);
128 sigdelset(&sigmask, sig.first);
140 FD_ZERO(&read_fd_set);
143 FD_SET(fd.first, &read_fd_set);
144 nfds = std::max(nfds, fd.first + 1);
151 memset(&kernel_sigset, 0,
sizeof(kernel_sigset));
152 kernel_sigset.set = get_sigmask();
157 } extra_data = {&kernel_sigset,
sizeof(kernel_sigset)};
158 if (syscall(__NR_pselect6, nfds, &read_fd_set,
nullptr,
nullptr,
nullptr,
159 &extra_data) == -1 &&
169 sigset_t sigmask = get_sigmask();
176 read_fds.push_back(pfd);
179 if (ppoll(read_fds.data(), read_fds.size(),
nullptr, &sigmask) == -1 &&
193 std::vector<IOObject::WaitableHandle> fds;
195 if (FD_ISSET(fd.first, &read_fd_set))
196 fds.push_back(fd.first);
198 for (
const auto &handle : fds) {
200 for (
const auto &fd : read_fds) {
201 if ((fd.revents & (POLLIN | POLLHUP)) == 0)
211 std::vector<int> signals;
214 signals.push_back(entry.first);
216 for (
const auto &signal : signals) {
225 MainLoopPosix::MainLoopPosix() : m_triggering(false) {
227 assert(
error.Success());
228 const int trigger_pipe_fd =
m_trigger_pipe.GetReadFileDescriptor();
231 ssize_t bytes_read = llvm::sys::RetryAfterSignal(
232 -1, ::read, trigger_pipe_fd, &c, 1);
233 assert(bytes_read == 1);
240 assert(m_kqueue >= 0);
257 if (!object_sp || !object_sp->IsValid()) {
258 error.SetErrorString(
"IO object is not valid.");
262 const bool inserted =
263 m_read_fds.insert({object_sp->GetWaitableHandle(), callback}).second;
265 error.SetErrorStringWithFormat(
"File descriptor %d already monitored.",
266 object_sp->GetWaitableHandle());
280 auto callback_it = signal_it->second.callbacks.insert(
281 signal_it->second.callbacks.end(), callback);
287 struct sigaction new_action;
289 new_action.sa_flags = SA_SIGINFO;
290 sigemptyset(&new_action.sa_mask);
291 sigaddset(&new_action.sa_mask, signo);
298 int ret = sigaction(signo, &new_action, &info.
old_action);
300 assert(ret == 0 &&
"sigaction failed");
304 EV_SET(&ev, signo, EVFILT_SIGNAL, EV_ADD, 0, 0, 0);
305 ret = kevent(m_kqueue, &ev, 1,
nullptr, 0,
nullptr);
312 ret = pthread_sigmask(HAVE_SYS_EVENT_H ? SIG_UNBLOCK : SIG_BLOCK,
313 &new_action.sa_mask, &old_set);
314 assert(ret == 0 &&
"pthread_sigmask failed");
316 auto insert_ret =
m_signals.insert({signo, info});
319 *
this, signo, insert_ret.first->second.callbacks.begin()));
329 int signo, std::list<Callback>::iterator callback_it) {
333 it->second.callbacks.erase(callback_it);
335 if (!it->second.callbacks.empty())
338 sigaction(signo, &it->second.old_action,
nullptr);
342 sigaddset(&
set, signo);
343 int ret = pthread_sigmask(it->second.was_blocked ? SIG_BLOCK : SIG_UNBLOCK,
350 EV_SET(&ev, signo, EVFILT_SIGNAL, EV_DELETE, 0, 0, 0);
351 ret = kevent(m_kqueue, &ev, 1,
nullptr, 0,
nullptr);
391 llvm::SmallVector<Callback, 4> callbacks_to_run{
392 it->second.callbacks.begin(), it->second.callbacks.end()};
393 for (
auto &x : callbacks_to_run)
403 size_t bytes_written;
405 assert(
error.Success());
407 assert(bytes_written == 1);