8134537: Much nearly duplicated code for sun.misc.Signal support

Merged jvm_<os>.cpp into jvm_posix.cpp

Reviewed-by: dholmes, stuefe
This commit is contained in:
Coleen Phillimore 2018-05-18 08:47:42 -04:00
parent 87ca9d07df
commit ab469d40fc
14 changed files with 32 additions and 400 deletions

View File

@ -1,111 +0,0 @@
/*
* Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2013 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#include "precompiled.hpp"
#include "jvm.h"
#include "runtime/interfaceSupport.inline.hpp"
#include "runtime/osThread.hpp"
#include <signal.h>
// sun.misc.Signal ///////////////////////////////////////////////////////////
// Signal code is mostly copied from classic vm, signals_md.c 1.4 98/08/23
/*
* This function is included primarily as a debugging aid. If Java is
* running in a console window, then pressing <CTRL-\\> will cause
* the current state of all active threads and monitors to be written
* to the console window.
*/
JVM_ENTRY_NO_ENV(void*, JVM_RegisterSignal(jint sig, void* handler))
// Copied from classic vm
// signals_md.c 1.4 98/08/23
void* newHandler = handler == (void *)2
? os::user_handler()
: handler;
switch (sig) {
/* The following are already used by the VM. */
case SIGFPE:
case SIGILL:
case SIGSEGV:
/* The following signal is used by the VM to dump thread stacks unless
ReduceSignalUsage is set, in which case the user is allowed to set
his own _native_ handler for this signal; thus, in either case,
we do not allow JVM_RegisterSignal to change the handler. */
case BREAK_SIGNAL:
return (void *)-1;
/* The following signals are used for Shutdown Hooks support. However, if
ReduceSignalUsage (-Xrs) is set, Shutdown Hooks must be invoked via
System.exit(), Java is not allowed to use these signals, and the the
user is allowed to set his own _native_ handler for these signals and
invoke System.exit() as needed. Terminator.setup() is avoiding
registration of these signals when -Xrs is present.
- If the HUP signal is ignored (from the nohup) command, then Java
is not allowed to use this signal.
*/
case SHUTDOWN1_SIGNAL:
case SHUTDOWN2_SIGNAL:
case SHUTDOWN3_SIGNAL:
if (ReduceSignalUsage) return (void*)-1;
if (os::Aix::is_sig_ignored(sig)) return (void*)1;
}
void* oldHandler = os::signal(sig, newHandler);
if (oldHandler == os::user_handler()) {
return (void *)2;
} else {
return oldHandler;
}
JVM_END
JVM_ENTRY_NO_ENV(jboolean, JVM_RaiseSignal(jint sig))
if (ReduceSignalUsage) {
// do not allow SHUTDOWN1_SIGNAL,SHUTDOWN2_SIGNAL,SHUTDOWN3_SIGNAL,
// BREAK_SIGNAL to be raised when ReduceSignalUsage is set, since
// no handler for them is actually registered in JVM or via
// JVM_RegisterSignal.
if (sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL ||
sig == SHUTDOWN3_SIGNAL || sig == BREAK_SIGNAL) {
return JNI_FALSE;
}
}
else if ((sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL ||
sig == SHUTDOWN3_SIGNAL) && os::Aix::is_sig_ignored(sig)) {
// do not allow SHUTDOWN1_SIGNAL to be raised when SHUTDOWN1_SIGNAL
// is ignored, since no handler for them is actually registered in JVM
// or via JVM_RegisterSignal.
// This also applies for SHUTDOWN2_SIGNAL and SHUTDOWN3_SIGNAL
return JNI_FALSE;
}
os::signal_raise(sig);
return JNI_TRUE;
JVM_END

View File

@ -622,18 +622,6 @@ extern "C" void breakpoint() {
debug_only(static bool signal_sets_initialized = false); debug_only(static bool signal_sets_initialized = false);
static sigset_t unblocked_sigs, vm_sigs; static sigset_t unblocked_sigs, vm_sigs;
bool os::Aix::is_sig_ignored(int sig) {
struct sigaction oact;
sigaction(sig, (struct sigaction*)NULL, &oact);
void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
: CAST_FROM_FN_PTR(void*, oact.sa_handler);
if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
return true;
} else {
return false;
}
}
void os::Aix::signal_sets_init() { void os::Aix::signal_sets_init() {
// Should also have an assertion stating we are still single-threaded. // Should also have an assertion stating we are still single-threaded.
assert(!signal_sets_initialized, "Already initialized"); assert(!signal_sets_initialized, "Already initialized");
@ -659,13 +647,13 @@ void os::Aix::signal_sets_init() {
sigaddset(&unblocked_sigs, SR_signum); sigaddset(&unblocked_sigs, SR_signum);
if (!ReduceSignalUsage) { if (!ReduceSignalUsage) {
if (!os::Aix::is_sig_ignored(SHUTDOWN1_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
} }
if (!os::Aix::is_sig_ignored(SHUTDOWN2_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
} }
if (!os::Aix::is_sig_ignored(SHUTDOWN3_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2016 SAP SE. All rights reserved. * Copyright (c) 2013, 2016 SAP SE. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
@ -121,7 +121,6 @@ class Aix {
static void signal_sets_init(); static void signal_sets_init();
static void install_signal_handlers(); static void install_signal_handlers();
static void set_signal_handler(int, bool); static void set_signal_handler(int, bool);
static bool is_sig_ignored(int sig);
static sigset_t* unblocked_signals(); static sigset_t* unblocked_signals();
static sigset_t* vm_signals(); static sigset_t* vm_signals();

View File

@ -533,18 +533,6 @@ extern "C" void breakpoint() {
debug_only(static bool signal_sets_initialized = false); debug_only(static bool signal_sets_initialized = false);
static sigset_t unblocked_sigs, vm_sigs; static sigset_t unblocked_sigs, vm_sigs;
bool os::Bsd::is_sig_ignored(int sig) {
struct sigaction oact;
sigaction(sig, (struct sigaction*)NULL, &oact);
void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
: CAST_FROM_FN_PTR(void*, oact.sa_handler);
if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
return true;
} else {
return false;
}
}
void os::Bsd::signal_sets_init() { void os::Bsd::signal_sets_init() {
// Should also have an assertion stating we are still single-threaded. // Should also have an assertion stating we are still single-threaded.
assert(!signal_sets_initialized, "Already initialized"); assert(!signal_sets_initialized, "Already initialized");
@ -569,14 +557,14 @@ void os::Bsd::signal_sets_init() {
sigaddset(&unblocked_sigs, SR_signum); sigaddset(&unblocked_sigs, SR_signum);
if (!ReduceSignalUsage) { if (!ReduceSignalUsage) {
if (!os::Bsd::is_sig_ignored(SHUTDOWN1_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
} }
if (!os::Bsd::is_sig_ignored(SHUTDOWN2_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
} }
if (!os::Bsd::is_sig_ignored(SHUTDOWN3_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -103,7 +103,6 @@ class Bsd {
static void signal_sets_init(); static void signal_sets_init();
static void install_signal_handlers(); static void install_signal_handlers();
static void set_signal_handler(int, bool); static void set_signal_handler(int, bool);
static bool is_sig_ignored(int sig);
static sigset_t* unblocked_signals(); static sigset_t* unblocked_signals();
static sigset_t* vm_signals(); static sigset_t* vm_signals();

View File

@ -1,110 +0,0 @@
/*
* Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#include "precompiled.hpp"
#include "jvm.h"
#include "runtime/interfaceSupport.inline.hpp"
#include "runtime/osThread.hpp"
#include <signal.h>
// sun.misc.Signal ///////////////////////////////////////////////////////////
// Signal code is mostly copied from classic vm, signals_md.c 1.4 98/08/23
/*
* This function is included primarily as a debugging aid. If Java is
* running in a console window, then pressing <CTRL-\\> will cause
* the current state of all active threads and monitors to be written
* to the console window.
*/
JVM_ENTRY_NO_ENV(void*, JVM_RegisterSignal(jint sig, void* handler))
// Copied from classic vm
// signals_md.c 1.4 98/08/23
void* newHandler = handler == (void *)2
? os::user_handler()
: handler;
switch (sig) {
/* The following are already used by the VM. */
case SIGFPE:
case SIGILL:
case SIGSEGV:
/* The following signal is used by the VM to dump thread stacks unless
ReduceSignalUsage is set, in which case the user is allowed to set
his own _native_ handler for this signal; thus, in either case,
we do not allow JVM_RegisterSignal to change the handler. */
case BREAK_SIGNAL:
return (void *)-1;
/* The following signals are used for Shutdown Hooks support. However, if
ReduceSignalUsage (-Xrs) is set, Shutdown Hooks must be invoked via
System.exit(), Java is not allowed to use these signals, and the the
user is allowed to set his own _native_ handler for these signals and
invoke System.exit() as needed. Terminator.setup() is avoiding
registration of these signals when -Xrs is present.
- If the HUP signal is ignored (from the nohup) command, then Java
is not allowed to use this signal.
*/
case SHUTDOWN1_SIGNAL:
case SHUTDOWN2_SIGNAL:
case SHUTDOWN3_SIGNAL:
if (ReduceSignalUsage) return (void*)-1;
if (os::Linux::is_sig_ignored(sig)) return (void*)1;
}
void* oldHandler = os::signal(sig, newHandler);
if (oldHandler == os::user_handler()) {
return (void *)2;
} else {
return oldHandler;
}
JVM_END
JVM_ENTRY_NO_ENV(jboolean, JVM_RaiseSignal(jint sig))
if (ReduceSignalUsage) {
// do not allow SHUTDOWN1_SIGNAL,SHUTDOWN2_SIGNAL,SHUTDOWN3_SIGNAL,
// BREAK_SIGNAL to be raised when ReduceSignalUsage is set, since
// no handler for them is actually registered in JVM or via
// JVM_RegisterSignal.
if (sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL ||
sig == SHUTDOWN3_SIGNAL || sig == BREAK_SIGNAL) {
return JNI_FALSE;
}
}
else if ((sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL ||
sig == SHUTDOWN3_SIGNAL) && os::Linux::is_sig_ignored(sig)) {
// do not allow SHUTDOWN1_SIGNAL to be raised when SHUTDOWN1_SIGNAL
// is ignored, since no handler for them is actually registered in JVM
// or via JVM_RegisterSignal.
// This also applies for SHUTDOWN2_SIGNAL and SHUTDOWN3_SIGNAL
return JNI_FALSE;
}
os::signal_raise(sig);
return JNI_TRUE;
JVM_END

View File

@ -425,18 +425,6 @@ extern "C" void breakpoint() {
debug_only(static bool signal_sets_initialized = false); debug_only(static bool signal_sets_initialized = false);
static sigset_t unblocked_sigs, vm_sigs; static sigset_t unblocked_sigs, vm_sigs;
bool os::Linux::is_sig_ignored(int sig) {
struct sigaction oact;
sigaction(sig, (struct sigaction*)NULL, &oact);
void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
: CAST_FROM_FN_PTR(void*, oact.sa_handler);
if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
return true;
} else {
return false;
}
}
void os::Linux::signal_sets_init() { void os::Linux::signal_sets_init() {
// Should also have an assertion stating we are still single-threaded. // Should also have an assertion stating we are still single-threaded.
assert(!signal_sets_initialized, "Already initialized"); assert(!signal_sets_initialized, "Already initialized");
@ -464,13 +452,13 @@ void os::Linux::signal_sets_init() {
sigaddset(&unblocked_sigs, SR_signum); sigaddset(&unblocked_sigs, SR_signum);
if (!ReduceSignalUsage) { if (!ReduceSignalUsage) {
if (!os::Linux::is_sig_ignored(SHUTDOWN1_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
} }
if (!os::Linux::is_sig_ignored(SHUTDOWN2_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
} }
if (!os::Linux::is_sig_ignored(SHUTDOWN3_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
} }
} }

View File

@ -160,7 +160,6 @@ class Linux {
static void signal_sets_init(); static void signal_sets_init();
static void install_signal_handlers(); static void install_signal_handlers();
static void set_signal_handler(int, bool); static void set_signal_handler(int, bool);
static bool is_sig_ignored(int sig);
static sigset_t* unblocked_signals(); static sigset_t* unblocked_signals();
static sigset_t* vm_signals(); static sigset_t* vm_signals();

View File

@ -30,7 +30,7 @@
#include <signal.h> #include <signal.h>
// sun.misc.Signal /////////////////////////////////////////////////////////// // jdk.internal.misc.Signal ///////////////////////////////////////////////////////////
// Signal code is mostly copied from classic vm, signals_md.c 1.4 98/08/23 // Signal code is mostly copied from classic vm, signals_md.c 1.4 98/08/23
/* /*
* This function is included primarily as a debugging aid. If Java is * This function is included primarily as a debugging aid. If Java is
@ -78,7 +78,7 @@ JVM_ENTRY_NO_ENV(void*, JVM_RegisterSignal(jint sig, void* handler))
case SHUTDOWN2_SIGNAL: case SHUTDOWN2_SIGNAL:
case SHUTDOWN3_SIGNAL: case SHUTDOWN3_SIGNAL:
if (ReduceSignalUsage) return (void*)-1; if (ReduceSignalUsage) return (void*)-1;
if (os::Bsd::is_sig_ignored(sig)) return (void*)1; if (os::Posix::is_sig_ignored(sig)) return (void*)1;
} }
void* oldHandler = os::signal(sig, newHandler); void* oldHandler = os::signal(sig, newHandler);
@ -102,7 +102,7 @@ JVM_ENTRY_NO_ENV(jboolean, JVM_RaiseSignal(jint sig))
} }
} }
else if ((sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL || else if ((sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL ||
sig == SHUTDOWN3_SIGNAL) && os::Bsd::is_sig_ignored(sig)) { sig == SHUTDOWN3_SIGNAL) && os::Posix::is_sig_ignored(sig)) {
// do not allow SHUTDOWN1_SIGNAL to be raised when SHUTDOWN1_SIGNAL // do not allow SHUTDOWN1_SIGNAL to be raised when SHUTDOWN1_SIGNAL
// is ignored, since no handler for them is actually registered in JVM // is ignored, since no handler for them is actually registered in JVM
// or via JVM_RegisterSignal. // or via JVM_RegisterSignal.

View File

@ -926,6 +926,18 @@ bool os::Posix::is_valid_signal(int sig) {
#endif #endif
} }
bool os::Posix::is_sig_ignored(int sig) {
struct sigaction oact;
sigaction(sig, (struct sigaction*)NULL, &oact);
void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
: CAST_FROM_FN_PTR(void*, oact.sa_handler);
if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
return true;
} else {
return false;
}
}
// Returns: // Returns:
// NULL for an invalid signal number // NULL for an invalid signal number
// "SIG<num>" for a valid but unknown signal number // "SIG<num>" for a valid but unknown signal number

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -64,6 +64,7 @@ public:
// Returns true if signal is valid. // Returns true if signal is valid.
static bool is_valid_signal(int sig); static bool is_valid_signal(int sig);
static bool is_sig_ignored(int sig);
// Helper function, returns a string (e.g. "SIGILL") for a signal. // Helper function, returns a string (e.g. "SIGILL") for a signal.
// Returned string is a constant. For unknown signals "UNKNOWN" is returned. // Returned string is a constant. For unknown signals "UNKNOWN" is returned.

View File

@ -1,108 +0,0 @@
/*
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*
*/
#include "precompiled.hpp"
#include "jvm.h"
#include "runtime/interfaceSupport.inline.hpp"
#include "runtime/osThread.hpp"
#include <signal.h>
// sun.misc.Signal ///////////////////////////////////////////////////////////
// Signal code is mostly copied from classic vm, signals_md.c 1.4 98/08/23
/*
* This function is included primarily as a debugging aid. If Java is
* running in a console window, then pressing <CTRL-\\> will cause
* the current state of all active threads and monitors to be written
* to the console window.
*/
JVM_ENTRY_NO_ENV(void*, JVM_RegisterSignal(jint sig, void* handler))
// Copied from classic vm
// signals_md.c 1.4 98/08/23
void* newHandler = handler == (void *)2
? os::user_handler()
: handler;
switch (sig) {
/* The following are already used by the VM. */
case SIGFPE:
case SIGILL:
case SIGSEGV:
/* The following signal is used by the VM to dump thread stacks unless
ReduceSignalUsage is set, in which case the user is allowed to set
his own _native_ handler for this signal; thus, in either case,
we do not allow JVM_RegisterSignal to change the handler. */
case BREAK_SIGNAL:
return (void *)-1;
/* The following signals are used for Shutdown Hooks support. However, if
ReduceSignalUsage (-Xrs) is set, Shutdown Hooks must be invoked via
System.exit(), Java is not allowed to use these signals, and the the
user is allowed to set his own _native_ handler for these signals and
invoke System.exit() as needed. Terminator.setup() is avoiding
registration of these signals when -Xrs is present.
- If the HUP signal is ignored (from the nohup) command, then Java
is not allowed to use this signal.
*/
case SHUTDOWN1_SIGNAL:
case SHUTDOWN2_SIGNAL:
case SHUTDOWN3_SIGNAL:
if (ReduceSignalUsage) return (void*)-1;
if (os::Solaris::is_sig_ignored(sig)) return (void*)1;
}
void* oldHandler = os::signal(sig, newHandler);
if (oldHandler == os::user_handler()) {
return (void *)2;
} else {
return oldHandler;
}
JVM_END
JVM_ENTRY_NO_ENV(jboolean, JVM_RaiseSignal(jint sig))
if (ReduceSignalUsage) {
// do not allow SHUTDOWN1_SIGNAL,SHUTDOWN2_SIGNAL,SHUTDOWN3_SIGNAL,
// BREAK_SIGNAL to be raised when ReduceSignalUsage is set, since
// no handler for them is actually registered in JVM or via
// JVM_RegisterSignal.
if (sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL ||
sig == SHUTDOWN3_SIGNAL || sig == BREAK_SIGNAL) {
return JNI_FALSE;
}
}
else if ((sig == SHUTDOWN1_SIGNAL || sig == SHUTDOWN2_SIGNAL ||
sig == SHUTDOWN3_SIGNAL) && os::Solaris::is_sig_ignored(sig)) {
// do not allow SHUTDOWN1_SIGNAL to be raised when SHUTDOWN1_SIGNAL
// is ignored, since no handler for them is actually registered in JVM
// or via JVM_RegisterSignal.
// This also applies for SHUTDOWN2_SIGNAL and SHUTDOWN3_SIGNAL
return JNI_FALSE;
}
os::signal_raise(sig);
return JNI_TRUE;
JVM_END

View File

@ -1026,18 +1026,6 @@ bool os::create_thread(Thread* thread, ThreadType thr_type,
debug_only(static bool signal_sets_initialized = false); debug_only(static bool signal_sets_initialized = false);
static sigset_t unblocked_sigs, vm_sigs; static sigset_t unblocked_sigs, vm_sigs;
bool os::Solaris::is_sig_ignored(int sig) {
struct sigaction oact;
sigaction(sig, (struct sigaction*)NULL, &oact);
void* ohlr = oact.sa_sigaction ? CAST_FROM_FN_PTR(void*, oact.sa_sigaction)
: CAST_FROM_FN_PTR(void*, oact.sa_handler);
if (ohlr == CAST_FROM_FN_PTR(void*, SIG_IGN)) {
return true;
} else {
return false;
}
}
void os::Solaris::signal_sets_init() { void os::Solaris::signal_sets_init() {
// Should also have an assertion stating we are still single-threaded. // Should also have an assertion stating we are still single-threaded.
assert(!signal_sets_initialized, "Already initialized"); assert(!signal_sets_initialized, "Already initialized");
@ -1062,13 +1050,13 @@ void os::Solaris::signal_sets_init() {
sigaddset(&unblocked_sigs, ASYNC_SIGNAL); sigaddset(&unblocked_sigs, ASYNC_SIGNAL);
if (!ReduceSignalUsage) { if (!ReduceSignalUsage) {
if (!os::Solaris::is_sig_ignored(SHUTDOWN1_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN1_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN1_SIGNAL);
} }
if (!os::Solaris::is_sig_ignored(SHUTDOWN2_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN2_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN2_SIGNAL);
} }
if (!os::Solaris::is_sig_ignored(SHUTDOWN3_SIGNAL)) { if (!os::Posix::is_sig_ignored(SHUTDOWN3_SIGNAL)) {
sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL); sigaddset(&unblocked_sigs, SHUTDOWN3_SIGNAL);
} }
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -188,7 +188,6 @@ class Solaris {
static void install_signal_handlers(); static void install_signal_handlers();
static void set_signal_handler(int sig, bool set_installed, bool oktochain); static void set_signal_handler(int sig, bool set_installed, bool oktochain);
static void init_signal_mem(); static void init_signal_mem();
static bool is_sig_ignored(int sig);
static void set_our_sigflags(int, int); static void set_our_sigflags(int, int);
static int get_our_sigflags(int); static int get_our_sigflags(int);