]> gitweb.factorcode.org Git - factor.git/commitdiff
vm: hand SIGALRM to signal pipe if not sampling
authorJoe Groff <arcata@gmail.com>
Wed, 9 Nov 2011 07:37:22 +0000 (23:37 -0800)
committerJoe Groff <arcata@gmail.com>
Wed, 9 Nov 2011 07:37:22 +0000 (23:37 -0800)
vm/os-unix.cpp

index 0a1d13c3123cc8589a7b5914b71cd536af850442..84bcf43122dfc81f4dcb992e47668e76946ffea8 100755 (executable)
@@ -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)