From 3726f61c7090804f89d665f2d446e19afd0289e9 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Wed, 19 Oct 2011 22:47:14 -0700 Subject: [PATCH] vm: fatal_error if VM-less thread gets a signal --- vm/errors.cpp | 4 +--- vm/os-unix.cpp | 12 +++++++++--- vm/vm.hpp | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/vm/errors.cpp b/vm/errors.cpp index 7869b79b58..f0df0acbb8 100755 --- a/vm/errors.cpp +++ b/vm/errors.cpp @@ -142,9 +142,7 @@ void factor_vm::synchronous_signal_handler_impl() void synchronous_signal_handler_impl() { - factor_vm *vm = current_vm_p(); - if (vm) - vm->synchronous_signal_handler_impl(); + current_vm()->synchronous_signal_handler_impl(); } void factor_vm::fp_signal_handler_impl() diff --git a/vm/os-unix.cpp b/vm/os-unix.cpp index 90ce67e0d0..a198f10a1e 100755 --- a/vm/os-unix.cpp +++ b/vm/os-unix.cpp @@ -153,9 +153,13 @@ void memory_signal_handler(int signal, siginfo_t *siginfo, void *uap) void synchronous_signal_handler(int signal, siginfo_t *siginfo, void *uap) { - factor_vm *vm = current_vm(); - vm->signal_number = signal; - vm->dispatch_signal(uap,factor::synchronous_signal_handler_impl); + factor_vm *vm = current_vm_p(); + if (vm) + { + vm->signal_number = signal; + vm->dispatch_signal(uap,factor::synchronous_signal_handler_impl); + } else + fatal_error("Foreign thread received signal ", signal); } void next_safepoint_signal_handler(int signal, siginfo_t *siginfo, void *uap) @@ -163,6 +167,8 @@ void next_safepoint_signal_handler(int signal, siginfo_t *siginfo, void *uap) factor_vm *vm = current_vm_p(); if (vm) vm->enqueue_safepoint_signal(signal); + else + fatal_error("Foreign thread received signal ", signal); } void ignore_signal_handler(int signal, siginfo_t *siginfo, void *uap) diff --git a/vm/vm.hpp b/vm/vm.hpp index ae0d73541d..88633023d5 100755 --- a/vm/vm.hpp +++ b/vm/vm.hpp @@ -211,7 +211,7 @@ struct factor_vm bignum * * quotient, bignum * * remainder, int q_negative_p, int r_negative_p); void bignum_divide_unsigned_normalized(bignum * u, bignum * v, bignum * q); bignum_digit_type bignum_divide_subtract(bignum_digit_type * v_start, bignum_digit_type * v_end, - bignum_digit_type guess, bignum_digit_type * u_start); + bignum_digit_type guess, bignum_digit_type * u_start); void bignum_divide_unsigned_medium_denominator(bignum * numerator,bignum_digit_type denominator, bignum * * quotient, bignum * * remainder,int q_negative_p, int r_negative_p); void bignum_destructive_normalization(bignum * source, bignum * target, int shift_left);