Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 1 | //===-- UnixSignals.cpp -----------------------------------------*- 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 | #include "lldb/Target/UnixSignals.h" |
| 11 | |
| 12 | // C Includes |
| 13 | // C++ Includes |
| 14 | // Other libraries and framework includes |
| 15 | // Project includes |
| 16 | |
| 17 | using namespace lldb_private; |
| 18 | |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 19 | UnixSignals::Signal::Signal |
| 20 | ( |
| 21 | const char *name, |
| 22 | const char *short_name, |
| 23 | bool default_suppress, |
| 24 | bool default_stop, |
| 25 | bool default_notify, |
| 26 | const char *description |
| 27 | ) : |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 28 | m_name (name), |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 29 | m_short_name (short_name), |
| 30 | m_description (), |
| 31 | m_suppress (default_suppress), |
| 32 | m_stop (default_stop), |
| 33 | m_notify (default_notify) |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 34 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 35 | if (description) |
| 36 | m_description.assign (description); |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 37 | } |
| 38 | |
| 39 | //---------------------------------------------------------------------- |
| 40 | // UnixSignals constructor |
| 41 | //---------------------------------------------------------------------- |
| 42 | UnixSignals::UnixSignals () |
| 43 | { |
| 44 | Reset (); |
| 45 | } |
| 46 | |
| 47 | //---------------------------------------------------------------------- |
| 48 | // Destructor |
| 49 | //---------------------------------------------------------------------- |
| 50 | UnixSignals::~UnixSignals () |
| 51 | { |
| 52 | } |
| 53 | |
| 54 | void |
| 55 | UnixSignals::Reset () |
| 56 | { |
| 57 | // This builds one standard set of Unix Signals. If yours aren't quite in this |
| 58 | // order, you can either subclass this class, and use Add & Remove to change them |
| 59 | // or you can subclass and build them afresh in your constructor; |
| 60 | m_signals.clear(); |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 61 | // SIGNO NAME SHORT NAME SUPPRESS STOP NOTIFY DESCRIPTION |
| 62 | // ====== ============ ========== ========= ====== ====== =================================================== |
| 63 | AddSignal (1, "SIGHUP", "HUP", false, true, true, "hangup"); |
| 64 | AddSignal (2, "SIGINT", "INT", true, true, true, "interrupt"); |
| 65 | AddSignal (3, "SIGQUIT", "QUIT", false, true, true, "quit"); |
| 66 | AddSignal (4, "SIGILL", "ILL", false, true, true, "illegal instruction"); |
| 67 | AddSignal (5, "SIGTRAP", "TRAP", true, true, true, "trace trap (not reset when caught)"); |
| 68 | AddSignal (6, "SIGABRT", "ABRT", false, true, true, "abort()"); |
| 69 | AddSignal (7, "SIGEMT", "EMT", false, true, true, "pollable event"); |
| 70 | AddSignal (8, "SIGFPE", "FPE", false, true, true, "floating point exception"); |
| 71 | AddSignal (9, "SIGKILL", "KILL", false, true, true, "kill"); |
| 72 | AddSignal (10, "SIGBUS", "BUS", false, true, true, "bus error"); |
| 73 | AddSignal (11, "SIGSEGV", "SEGV", false, true, true, "segmentation violation"); |
| 74 | AddSignal (12, "SIGSYS", "SYS", false, true, true, "bad argument to system call"); |
| 75 | AddSignal (13, "SIGPIPE", "PIPE", false, true, true, "write on a pipe with no one to read it"); |
| 76 | AddSignal (14, "SIGALRM", "ALRM", false, false, true, "alarm clock"); |
| 77 | AddSignal (15, "SIGTERM", "TERM", false, true, true, "software termination signal from kill"); |
| 78 | AddSignal (16, "SIGURG", "URG", false, false, false, "urgent condition on IO channel"); |
| 79 | AddSignal (17, "SIGSTOP", "STOP", false, true, true, "sendable stop signal not from tty"); |
| 80 | AddSignal (18, "SIGTSTP", "TSTP", false, true, true, "stop signal from tty"); |
| 81 | AddSignal (19, "SIGCONT", "CONT", false, true, true, "continue a stopped process"); |
| 82 | AddSignal (20, "SIGCHLD", "CHLD", false, false, true, "to parent on child stop or exit"); |
| 83 | AddSignal (21, "SIGTTIN", "TTIN", false, true, true, "to readers process group upon background tty read"); |
| 84 | AddSignal (22, "SIGTTOU", "TTOU", false, true, true, "to readers process group upon background tty write"); |
| 85 | AddSignal (23, "SIGIO", "IO", false, false, false, "input/output possible signal"); |
| 86 | AddSignal (24, "SIGXCPU", "XCPU", false, true, true, "exceeded CPU time limit"); |
| 87 | AddSignal (25, "SIGXFSZ", "XFSZ", false, true, true, "exceeded file size limit"); |
| 88 | AddSignal (26, "SIGVTALRM", "VTALRM", false, false, false, "virtual time alarm"); |
| 89 | AddSignal (27, "SIGPROF", "PROF", false, false, false, "profiling time alarm"); |
| 90 | AddSignal (28, "SIGWINCH", "WINCH", false, false, false, "window size changes"); |
| 91 | AddSignal (29, "SIGINFO", "INFO", false, true, true, "information request"); |
| 92 | AddSignal (30, "SIGUSR1", "USR1", false, true, true, "user defined signal 1"); |
| 93 | AddSignal (31, "SIGUSR2", "USR2", false, true, true, "user defined signal 2"); |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 94 | } |
Greg Clayton | 8f6be2a | 2010-10-09 01:40:57 +0000 | [diff] [blame] | 95 | |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 96 | void |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 97 | UnixSignals::AddSignal |
| 98 | ( |
| 99 | int signo, |
| 100 | const char *name, |
| 101 | const char *short_name, |
| 102 | bool default_suppress, |
| 103 | bool default_stop, |
| 104 | bool default_notify, |
| 105 | const char *description |
| 106 | ) |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 107 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 108 | Signal new_signal (name, short_name, default_suppress, default_stop, default_notify, description); |
| 109 | m_signals.insert (std::make_pair(signo, new_signal)); |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 110 | } |
| 111 | |
| 112 | void |
| 113 | UnixSignals::RemoveSignal (int signo) |
| 114 | { |
| 115 | collection::iterator pos = m_signals.find (signo); |
| 116 | if (pos != m_signals.end()) |
| 117 | m_signals.erase (pos); |
| 118 | } |
| 119 | |
| 120 | UnixSignals::Signal * |
| 121 | UnixSignals::GetSignalByName (const char *name, int32_t &signo) |
| 122 | { |
| 123 | ConstString const_name (name); |
| 124 | |
| 125 | collection::iterator pos, end = m_signals.end (); |
| 126 | for (pos = m_signals.begin (); pos != end; pos++) |
| 127 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 128 | if ((const_name == pos->second.m_name) || (const_name == pos->second.m_short_name)) |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 129 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 130 | signo = pos->first; |
| 131 | return &pos->second; |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 132 | } |
| 133 | } |
| 134 | return NULL; |
| 135 | } |
| 136 | |
| 137 | |
| 138 | const UnixSignals::Signal * |
| 139 | UnixSignals::GetSignalByName (const char *name, int32_t &signo) const |
| 140 | { |
| 141 | ConstString const_name (name); |
| 142 | |
| 143 | collection::const_iterator pos, end = m_signals.end (); |
| 144 | for (pos = m_signals.begin (); pos != end; pos++) |
| 145 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 146 | if (const_name == pos->second.m_name) |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 147 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 148 | signo = pos->first; |
| 149 | return &(pos->second); |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 150 | } |
| 151 | } |
| 152 | return NULL; |
| 153 | } |
| 154 | |
| 155 | const char * |
| 156 | UnixSignals::GetSignalAsCString (int signo) const |
| 157 | { |
| 158 | collection::const_iterator pos = m_signals.find (signo); |
| 159 | if (pos == m_signals.end()) |
| 160 | return NULL; |
| 161 | else |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 162 | return pos->second.m_name.GetCString (); |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 163 | } |
| 164 | |
| 165 | |
| 166 | bool |
| 167 | UnixSignals::SignalIsValid (int32_t signo) const |
| 168 | { |
| 169 | return m_signals.find (signo) != m_signals.end(); |
| 170 | } |
| 171 | |
| 172 | |
| 173 | int32_t |
| 174 | UnixSignals::GetSignalNumberFromName (const char *name) const |
| 175 | { |
| 176 | int32_t signo; |
| 177 | const Signal *signal = GetSignalByName (name, signo); |
| 178 | if (signal == NULL) |
| 179 | return LLDB_INVALID_SIGNAL_NUMBER; |
| 180 | else |
| 181 | return signo; |
| 182 | } |
| 183 | |
| 184 | int32_t |
| 185 | UnixSignals::GetFirstSignalNumber () const |
| 186 | { |
| 187 | if (m_signals.empty()) |
| 188 | return LLDB_INVALID_SIGNAL_NUMBER; |
| 189 | |
| 190 | return (*m_signals.begin ()).first; |
| 191 | } |
| 192 | |
| 193 | int32_t |
| 194 | UnixSignals::GetNextSignalNumber (int32_t current_signal) const |
| 195 | { |
| 196 | collection::const_iterator pos = m_signals.find (current_signal); |
| 197 | collection::const_iterator end = m_signals.end(); |
| 198 | if (pos == end) |
| 199 | return LLDB_INVALID_SIGNAL_NUMBER; |
| 200 | else |
| 201 | { |
| 202 | pos++; |
| 203 | if (pos == end) |
| 204 | return LLDB_INVALID_SIGNAL_NUMBER; |
| 205 | else |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 206 | return pos->first; |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 207 | } |
| 208 | } |
| 209 | |
| 210 | const char * |
| 211 | UnixSignals::GetSignalInfo |
| 212 | ( |
| 213 | int32_t signo, |
| 214 | bool &should_suppress, |
| 215 | bool &should_stop, |
| 216 | bool &should_notify |
| 217 | ) const |
| 218 | { |
| 219 | collection::const_iterator pos = m_signals.find (signo); |
| 220 | if (pos == m_signals.end()) |
| 221 | return NULL; |
| 222 | else |
| 223 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 224 | const Signal &signal = pos->second; |
| 225 | should_suppress = signal.m_suppress; |
| 226 | should_stop = signal.m_stop; |
| 227 | should_notify = signal.m_notify; |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 228 | return signal.m_name.AsCString(""); |
| 229 | } |
| 230 | } |
| 231 | |
| 232 | bool |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 233 | UnixSignals::GetShouldSuppress (int signo) const |
| 234 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 235 | collection::const_iterator pos = m_signals.find (signo); |
| 236 | if (pos != m_signals.end()) |
| 237 | return pos->second.m_suppress; |
| 238 | return false; |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 239 | } |
| 240 | |
| 241 | bool |
| 242 | UnixSignals::SetShouldSuppress (int signo, bool value) |
| 243 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 244 | collection::iterator pos = m_signals.find (signo); |
| 245 | if (pos != m_signals.end()) |
| 246 | { |
| 247 | pos->second.m_suppress = value; |
| 248 | return true; |
| 249 | } |
| 250 | return false; |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 251 | } |
| 252 | |
| 253 | bool |
| 254 | UnixSignals::SetShouldSuppress (const char *signal_name, bool value) |
| 255 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 256 | return SetShouldSuppress (GetSignalNumberFromName (signal_name), value); |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 257 | } |
| 258 | |
| 259 | bool |
| 260 | UnixSignals::GetShouldStop (int signo) const |
| 261 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 262 | collection::const_iterator pos = m_signals.find (signo); |
| 263 | if (pos != m_signals.end()) |
| 264 | return pos->second.m_stop; |
| 265 | return false; |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 266 | } |
| 267 | |
| 268 | bool |
| 269 | UnixSignals::SetShouldStop (int signo, bool value) |
| 270 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 271 | collection::iterator pos = m_signals.find (signo); |
| 272 | if (pos != m_signals.end()) |
| 273 | { |
| 274 | pos->second.m_stop = value; |
| 275 | return true; |
| 276 | } |
| 277 | return false; |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 278 | } |
| 279 | |
| 280 | bool |
| 281 | UnixSignals::SetShouldStop (const char *signal_name, bool value) |
| 282 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 283 | return SetShouldStop (GetSignalNumberFromName (signal_name), value); |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 284 | } |
| 285 | |
| 286 | bool |
| 287 | UnixSignals::GetShouldNotify (int signo) const |
| 288 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 289 | collection::const_iterator pos = m_signals.find (signo); |
| 290 | if (pos != m_signals.end()) |
| 291 | return pos->second.m_notify; |
| 292 | return false; |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 293 | } |
| 294 | |
| 295 | bool |
| 296 | UnixSignals::SetShouldNotify (int signo, bool value) |
| 297 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 298 | collection::iterator pos = m_signals.find (signo); |
| 299 | if (pos != m_signals.end()) |
| 300 | { |
| 301 | pos->second.m_notify = value; |
| 302 | return true; |
| 303 | } |
| 304 | return false; |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 305 | } |
| 306 | |
| 307 | bool |
| 308 | UnixSignals::SetShouldNotify (const char *signal_name, bool value) |
| 309 | { |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 310 | return SetShouldNotify (GetSignalNumberFromName (signal_name), value); |
Chris Lattner | 24943d2 | 2010-06-08 16:52:24 +0000 | [diff] [blame] | 311 | } |
Greg Clayton | deb391c | 2010-10-15 02:39:01 +0000 | [diff] [blame] | 312 | |