src/hotspot/share/runtime/os.cpp
changeset 55682 70fab3a8ff02
parent 54786 ebf733a324d4
child 55719 4888ccfc234e
--- 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