From 5f47dd85f452698b67d3e7399a45f8dcd0cd742f Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 8 Nov 2011 23:37:22 -0800 Subject: [PATCH] vm: hand SIGALRM to signal pipe if not sampling --- vm/os-unix.cpp | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/vm/os-unix.cpp b/vm/os-unix.cpp index 0a1d13c312..84bcf43122 100755 --- a/vm/os-unix.cpp +++ b/vm/os-unix.cpp @@ -212,12 +212,16 @@ void fep_signal_handler(int signal, siginfo_t *siginfo, void *uap) void sample_signal_handler(int signal, siginfo_t *siginfo, void *uap) { factor_vm *vm = current_vm_p(); - if (vm) - vm->safepoint.enqueue_samples(vm, 1, (cell)UAP_PROGRAM_COUNTER(uap), false); - else if (thread_vms.size() == 1) { - factor_vm *the_only_vm = thread_vms.begin()->second; - the_only_vm->safepoint.enqueue_samples(the_only_vm, 1, (cell)UAP_PROGRAM_COUNTER(uap), true); + bool foreign_thread = false; + if (vm == NULL) + { + foreign_thread = true; + vm = thread_vms.begin()->second; } + if (atomic::load(&vm->sampling_profiler_p)) + vm->safepoint.enqueue_samples(vm, 1, (cell)UAP_PROGRAM_COUNTER(uap), foreign_thread); + else if (!foreign_thread) + enqueue_signal(vm, signal); } void ignore_signal_handler(int signal, siginfo_t *siginfo, void *uap)