ProcessPOSIX.h revision c643077dd2048204d78bc8b19629d0a3dca055fd
1//===-- ProcessPOSIX.h ------------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef liblldb_ProcessPOSIX_H_
11#define liblldb_ProcessPOSIX_H_
12
13// C Includes
14
15// C++ Includes
16#include <queue>
17
18// Other libraries and framework includes
19#include "lldb/Target/Process.h"
20#include "lldb/Target/UnixSignals.h"
21#include "ProcessMessage.h"
22
23class ProcessMonitor;
24
25class ProcessPOSIX :
26    public lldb_private::Process
27{
28public:
29
30    //------------------------------------------------------------------
31    // Constructors and destructors
32    //------------------------------------------------------------------
33    ProcessPOSIX(lldb_private::Target& target,
34                 lldb_private::Listener &listener);
35
36    virtual
37    ~ProcessPOSIX();
38
39    //------------------------------------------------------------------
40    // Process protocol.
41    //------------------------------------------------------------------
42    virtual bool
43    CanDebug(lldb_private::Target &target, bool plugin_specified_by_name);
44
45    virtual lldb_private::Error
46    WillLaunch(lldb_private::Module *module);
47
48    virtual lldb_private::Error
49    DoAttachToProcessWithID(lldb::pid_t pid);
50
51    virtual lldb_private::Error
52    DoAttachToProcessWithID (lldb::pid_t pid, const lldb_private::ProcessAttachInfo &attach_info);
53
54    virtual lldb_private::Error
55    DoLaunch (lldb_private::Module *exe_module,
56              const lldb_private::ProcessLaunchInfo &launch_info);
57
58    virtual void
59    DidLaunch();
60
61    virtual lldb_private::Error
62    DoResume();
63
64    virtual lldb_private::Error
65    DoHalt(bool &caused_stop);
66
67    virtual lldb_private::Error
68    DoDetach();
69
70    virtual lldb_private::Error
71    DoSignal(int signal);
72
73    virtual lldb_private::Error
74    DoDestroy();
75
76    virtual void
77    RefreshStateAfterStop();
78
79    virtual bool
80    IsAlive();
81
82    virtual size_t
83    DoReadMemory(lldb::addr_t vm_addr,
84                 void *buf,
85                 size_t size,
86                 lldb_private::Error &error);
87
88    virtual size_t
89    DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
90                  lldb_private::Error &error);
91
92    virtual lldb::addr_t
93    DoAllocateMemory(size_t size, uint32_t permissions,
94                     lldb_private::Error &error);
95
96    virtual lldb_private::Error
97    DoDeallocateMemory(lldb::addr_t ptr);
98
99    virtual size_t
100    GetSoftwareBreakpointTrapOpcode(lldb_private::BreakpointSite* bp_site);
101
102    virtual lldb_private::Error
103    EnableBreakpoint(lldb_private::BreakpointSite *bp_site);
104
105    virtual lldb_private::Error
106    DisableBreakpoint(lldb_private::BreakpointSite *bp_site);
107
108    virtual uint32_t
109    UpdateThreadListIfNeeded();
110
111    virtual bool
112    UpdateThreadList(lldb_private::ThreadList &old_thread_list,
113                     lldb_private::ThreadList &new_thread_list) = 0;
114
115    virtual lldb::ByteOrder
116    GetByteOrder() const;
117
118    virtual lldb::addr_t
119    GetImageInfoAddress();
120
121    virtual size_t
122    PutSTDIN(const char *buf, size_t len, lldb_private::Error &error);
123
124    virtual size_t
125    GetSTDOUT(char *buf, size_t len, lldb_private::Error &error);
126
127    virtual size_t
128    GetSTDERR(char *buf, size_t len, lldb_private::Error &error);
129
130    //--------------------------------------------------------------------------
131    // ProcessPOSIX internal API.
132
133    /// Registers the given message with this process.
134    void SendMessage(const ProcessMessage &message);
135
136    ProcessMonitor &
137    GetMonitor() { assert(m_monitor); return *m_monitor; }
138
139    lldb_private::UnixSignals &
140    GetUnixSignals();
141
142    const char *
143    GetFilePath(const lldb_private::ProcessLaunchInfo::FileAction *file_action,
144                const char *default_path);
145
146protected:
147    /// Target byte order.
148    lldb::ByteOrder m_byte_order;
149
150    /// Process monitor;
151    ProcessMonitor *m_monitor;
152
153    /// The module we are executing.
154    lldb_private::Module *m_module;
155
156    /// Message queue notifying this instance of inferior process state changes.
157    lldb_private::Mutex m_message_mutex;
158    std::queue<ProcessMessage> m_message_queue;
159
160    /// True when the process has entered a state of "limbo".
161    ///
162    /// This flag qualifies eStateStopped.  It lets us know that when we
163    /// continue from this state the process will exit.  Also, when true,
164    /// Process::m_exit_status is set.
165    bool m_in_limbo;
166
167    /// Drive any exit events to completion.
168    bool m_exit_now;
169
170    /// OS-specific signal set.
171    lldb_private::UnixSignals m_signals;
172
173    /// Returns true if the process has exited.
174    bool HasExited();
175
176    /// Returns true if the process is stopped.
177    bool IsStopped();
178
179    typedef std::map<lldb::addr_t, lldb::addr_t> MMapMap;
180    MMapMap m_addr_to_mmap_size;
181};
182
183#endif  // liblldb_MacOSXProcess_H_
184