* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * This source file is part of SableVM. * * * * See the file "LICENSE" for the copyright information and for * * the terms and conditions for copying, distribution and * * modification of this source file. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * HANDLING SIGNALS in SableVM (current implementation which is fine): static void _svmf_signal_throw (_svmt_JNIEnv *env, jint signal_code) { assert (env->signal_code == SVM_SIGNAL_NONE); if (env->signal_handler == NULL) { _svmt_JavaVM *vm = env->vm; if (vm->initialization == NULL) { return; /* delegate the signal */ } _svmf_initialization_unrecoverable_exception (env); } env->signal_code = signal_code; siglongjmp (*(env->signal_handler), 1); } This is how SableVM gets out of the signal handler. Important to understand: SIGSEGV and other hardware interrupts caused by executing code (e.g. div by zero, access to protected memory, bus misalignment [e.g. trying to store a long with wrong alignment in memory]) are delivered to a signal handler on the same execution thread. This make the longjump() call possible. Those interrupts, if not handled, usually result in the OS killing the application (core dump).