--- a/src/hotspot/share/runtime/os.cpp Mon Jul 15 11:23:05 2019 -0400
+++ b/src/hotspot/share/runtime/os.cpp Tue Jul 16 07:29:12 2019 +0900
@@ -362,8 +362,25 @@
case SIGBREAK: {
// Check if the signal is a trigger to start the Attach Listener - in that
// case don't print stack traces.
- if (!DisableAttachMechanism && AttachListener::is_init_trigger()) {
- continue;
+ if (!DisableAttachMechanism) {
+ // Attempt to transit state to AL_INITIALIZING.
+ AttachListenerState cur_state = AttachListener::transit_state(AL_INITIALIZING, AL_NOT_INITIALIZED);
+ if (cur_state == AL_INITIALIZING) {
+ // Attach Listener has been started to initialize. Ignore this signal.
+ continue;
+ } else if (cur_state == AL_NOT_INITIALIZED) {
+ // Start to initialize.
+ if (!AttachListener::is_init_trigger()) {
+ // Attach Listener could not be started.
+ // So we need to transit the state to AL_NOT_INITIALIZED.
+ AttachListener::set_state(AL_NOT_INITIALIZED);
+ }
+ continue;
+ } else if (AttachListener::check_socket_file()) {
+ // Attach Listener has been started, but unix domain socket file
+ // does not exist. So restart Attach Listener.
+ continue;
+ }
}
// Print stack traces
// Any SIGBREAK operations added here should make sure to flush