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