1/* 2 * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. 3 * Copyright (c) 2012, 2013 SAP SE. All rights reserved. 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 5 * 6 * This code is free software; you can redistribute it and/or modify it 7 * under the terms of the GNU General Public License version 2 only, as 8 * published by the Free Software Foundation. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 * 24 */ 25 26#include "precompiled.hpp" 27#include "prims/jvm.h" 28#include "runtime/interfaceSupport.hpp" 29#include "runtime/osThread.hpp" 30 31#include <signal.h> 32 33 34// sun.misc.Signal /////////////////////////////////////////////////////////// 35// Signal code is mostly copied from classic vm, signals_md.c 1.4 98/08/23 36/* 37 * This function is included primarily as a debugging aid. If Java is 38 * running in a console window, then pressing <CTRL-\\> will cause 39 * the current state of all active threads and monitors to be written 40 * to the console window. 41 */ 42 43JVM_ENTRY_NO_ENV(void*, JVM_RegisterSignal(jint sig, void* handler)) 44 // Copied from classic vm 45 // signals_md.c 1.4 98/08/23 46 void* newHandler = handler == (void *)2 47 ? os::user_handler() 48 : handler; 49 switch (sig) { 50 /* The following are already used by the VM. */ 51 case SIGFPE: 52 case SIGILL: 53 case SIGSEGV: 54 55 /* The following signal is used by the VM to dump thread stacks unless 56 ReduceSignalUsage is set, in which case the user is allowed to set 57 his own _native_ handler for this signal; thus, in either case, 58 we do not allow JVM_RegisterSignal to change the handler. */ 59 case BREAK_SIGNAL: 60 return (void *)-1; 61 62 /* The following signals are used for Shutdown Hooks support. However, if 63 ReduceSignalUsage (-Xrs) is set, Shutdown Hooks must be invoked via 64 System.exit(), Java is not allowed to use these signals, and the the 65 user is allowed to set his own _native_ handler for these signals and 66 invoke System.exit() as needed. Terminator.setup() is avoiding 67 registration of these signals when -Xrs is present. 68 - If the HUP signal is ignored (from the nohup) command, then Java 69 is not allowed to use this signal. 70 */ 71 72 case SHUTDOWN1_SIGNAL: 73 case SHUTDOWN2_SIGNAL: 74 case SHUTDOWN3_SIGNAL: 75 if (ReduceSignalUsage) return (void*)-1; 76 if (os::Aix::is_sig_ignored(sig)) return (void*)1; 77 } 78 79 void* oldHandler = os::signal(sig, newHandler); 80 if (oldHandler == os::user_handler()) { 81 return (void *)2; 82 } else { 83 return oldHandler; 84 } 85JVM_END 86 87 88JVM_ENTRY_NO_ENV(jboolean, JVM_RaiseSignal(jint sig)) 89 if (ReduceSignalUsage) { 90 // do not allow SHUTDOWN1_SIGNAL,SHUTDOWN2_SIGNAL,SHUTDOWN3_SIGNAL, 91 // BREAK_SIGNAL to be raised when ReduceSignalUsage is set, since 92 // no handler for them is actually registered in JVM or via 93 // JVM_RegisterSignal. 94 if (sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL || 95 sig == SHUTDOWN3_SIGNAL || sig == BREAK_SIGNAL) { 96 return JNI_FALSE; 97 } 98 } 99 else if ((sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL || 100 sig == SHUTDOWN3_SIGNAL) && os::Aix::is_sig_ignored(sig)) { 101 // do not allow SHUTDOWN1_SIGNAL to be raised when SHUTDOWN1_SIGNAL 102 // is ignored, since no handler for them is actually registered in JVM 103 // or via JVM_RegisterSignal. 104 // This also applies for SHUTDOWN2_SIGNAL and SHUTDOWN3_SIGNAL 105 return JNI_FALSE; 106 } 107 108 os::signal_raise(sig); 109 return JNI_TRUE; 110JVM_END 111 112