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