MCPcopy Create free account
hub / github.com/async-profiler/async-profiler / getProfilingSignal

Method getProfilingSignal

src/os_linux.cpp:289–309  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

287}
288
289int 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
311bool OS::sendSignalToThread(int thread_id, int signo) {
312 return syscall(__NR_tgkill, processId(), thread_id, signo) == 0;

Callers

nothing calls this directly

Calls 1

sigactionClass · 0.70

Tested by

no test coverage detected