File indexing completed on 2026-05-10 08:42:48
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLDB_HOST_POSIX_MAINLOOPPOSIX_H
0010 #define LLDB_HOST_POSIX_MAINLOOPPOSIX_H
0011
0012 #include "lldb/Host/Config.h"
0013 #include "lldb/Host/MainLoopBase.h"
0014 #include "lldb/Host/Pipe.h"
0015 #include "llvm/ADT/DenseMap.h"
0016 #include <atomic>
0017 #include <csignal>
0018 #include <list>
0019 #include <vector>
0020
0021 namespace lldb_private {
0022
0023
0024
0025
0026
0027 class MainLoopPosix : public MainLoopBase {
0028 private:
0029 class SignalHandle;
0030
0031 public:
0032 typedef std::unique_ptr<SignalHandle> SignalHandleUP;
0033
0034 MainLoopPosix();
0035 ~MainLoopPosix() override;
0036
0037 ReadHandleUP RegisterReadObject(const lldb::IOObjectSP &object_sp,
0038 const Callback &callback,
0039 Status &error) override;
0040
0041
0042
0043
0044
0045
0046
0047
0048 SignalHandleUP RegisterSignal(int signo, const Callback &callback,
0049 Status &error);
0050
0051 Status Run() override;
0052
0053 protected:
0054 void UnregisterReadObject(IOObject::WaitableHandle handle) override;
0055 void UnregisterSignal(int signo, std::list<Callback>::iterator callback_it);
0056
0057 void Interrupt() override;
0058
0059 private:
0060 void ProcessReadObject(IOObject::WaitableHandle handle);
0061 void ProcessSignal(int signo);
0062 void ProcessSignals();
0063
0064 class SignalHandle {
0065 public:
0066 ~SignalHandle() { m_mainloop.UnregisterSignal(m_signo, m_callback_it); }
0067
0068 private:
0069 SignalHandle(MainLoopPosix &mainloop, int signo,
0070 std::list<Callback>::iterator callback_it)
0071 : m_mainloop(mainloop), m_signo(signo), m_callback_it(callback_it) {}
0072
0073 MainLoopPosix &m_mainloop;
0074 int m_signo;
0075 std::list<Callback>::iterator m_callback_it;
0076
0077 friend class MainLoopPosix;
0078 SignalHandle(const SignalHandle &) = delete;
0079 const SignalHandle &operator=(const SignalHandle &) = delete;
0080 };
0081
0082 struct SignalInfo {
0083 std::list<Callback> callbacks;
0084 struct sigaction old_action;
0085 bool was_blocked : 1;
0086 };
0087 class RunImpl;
0088
0089 llvm::DenseMap<IOObject::WaitableHandle, Callback> m_read_fds;
0090 llvm::DenseMap<int, SignalInfo> m_signals;
0091 Pipe m_interrupt_pipe;
0092 std::atomic<bool> m_interrupting = false;
0093 #if HAVE_SYS_EVENT_H
0094 int m_kqueue;
0095 #endif
0096 };
0097
0098 }
0099
0100 #endif