| 287 | } |
| 288 | |
| 289 | int OS::getProfilingSignal(int mode) { |
| 290 | static int preferred_signals[2] = {SIGPROF, SIGVTALRM}; |
| 291 | |
| 292 | const u64 allowed_signals = |
| 293 | 1ULL << SIGPROF | 1ULL << SIGVTALRM | 1ULL << SIGSTKFLT | 1ULL << SIGPWR | -(1ULL << SIGRTMIN); |
| 294 | |
| 295 | int& signo = preferred_signals[mode]; |
| 296 | int initial_signo = signo; |
| 297 | int other_signo = preferred_signals[1 - mode]; |
| 298 | |
| 299 | do { |
| 300 | struct sigaction sa; |
| 301 | if ((allowed_signals & (1ULL << signo)) != 0 && signo != other_signo && sigaction(signo, NULL, &sa) == 0) { |
| 302 | if (sa.sa_handler == SIG_DFL || sa.sa_handler == SIG_IGN || sa.sa_sigaction == installed_sigaction[signo]) { |
| 303 | return signo; |
| 304 | } |
| 305 | } |
| 306 | } while ((signo = (signo + 53) & 63) != initial_signo); |
| 307 | |
| 308 | return signo; |
| 309 | } |
| 310 | |
| 311 | bool OS::sendSignalToThread(int thread_id, int signo) { |
| 312 | return syscall(__NR_tgkill, processId(), thread_id, signo) == 0; |