src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java
changeset 48485 258a4dab74a7
parent 47540 7242ab15b6a5
child 49742 1196aa0be8be
--- a/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java	Tue Dec 05 10:43:23 2017 +0000
+++ b/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java	Tue Jan 02 07:50:17 2018 -0500
@@ -47,10 +47,7 @@
     // will not be able to find all Hotspot processes.
     // Any changes to this needs to be synchronized with HotSpot.
     private static final String tmpdir = "/tmp";
-
-    // The patch to the socket file created by the target VM
-    String path;
-
+    String socket_path;
     /**
      * Attaches to the target VM
      */
@@ -73,8 +70,9 @@
         // Find the socket file. If not found then we attempt to start the
         // attach mechanism in the target VM by sending it a QUIT signal.
         // Then we attempt to find the socket file again.
-        path = findSocketFile(pid, ns_pid);
-        if (path == null) {
+        File socket_file = findSocketFile(pid, ns_pid);
+        socket_path = socket_file.getPath();
+        if (!socket_file.exists()) {
             File f = createAttachFile(pid, ns_pid);
             try {
                 sendQuitTo(pid);
@@ -90,19 +88,19 @@
                     try {
                         Thread.sleep(delay);
                     } catch (InterruptedException x) { }
-                    path = findSocketFile(pid, ns_pid);
 
                     time_spend += delay;
-                    if (time_spend > timeout/2 && path == null) {
+                    if (time_spend > timeout/2 && !socket_file.exists()) {
                         // Send QUIT again to give target VM the last chance to react
                         sendQuitTo(pid);
                     }
-                } while (time_spend <= timeout && path == null);
-                if (path == null) {
+                } while (time_spend <= timeout && !socket_file.exists());
+                if (!socket_file.exists()) {
                     throw new AttachNotSupportedException(
                         String.format("Unable to open socket file %s: " +
                           "target process %d doesn't respond within %dms " +
-                          "or HotSpot VM not loaded", f.getPath(), pid, time_spend));
+                          "or HotSpot VM not loaded", socket_path, pid,
+                                      time_spend));
                 }
             } finally {
                 f.delete();
@@ -111,14 +109,14 @@
 
         // Check that the file owner/permission to avoid attaching to
         // bogus process
-        checkPermissions(path);
+        checkPermissions(socket_path);
 
         // Check that we can connect to the process
         // - this ensures we throw the permission denied error now rather than
         // later when we attempt to enqueue a command.
         int s = socket();
         try {
-            connect(s, path);
+            connect(s, socket_path);
         } finally {
             close(s);
         }
@@ -129,8 +127,8 @@
      */
     public void detach() throws IOException {
         synchronized (this) {
-            if (this.path != null) {
-                this.path = null;
+            if (socket_path != null) {
+                socket_path = null;
             }
         }
     }
@@ -148,12 +146,10 @@
         assert args.length <= 3;                // includes null
 
         // did we detach?
-        String p;
         synchronized (this) {
-            if (this.path == null) {
+            if (socket_path == null) {
                 throw new IOException("Detached from target VM");
             }
-            p = this.path;
         }
 
         // create UNIX socket
@@ -161,7 +157,7 @@
 
         // connect to target VM
         try {
-            connect(s, p);
+            connect(s, socket_path);
         } catch (IOException x) {
             close(s);
             throw x;
@@ -257,8 +253,9 @@
             if ((off < 0) || (off > bs.length) || (len < 0) ||
                 ((off + len) > bs.length) || ((off + len) < 0)) {
                 throw new IndexOutOfBoundsException();
-            } else if (len == 0)
+            } else if (len == 0) {
                 return 0;
+            }
 
             return VirtualMachineImpl.read(s, bs, off, len);
         }
@@ -269,16 +266,12 @@
     }
 
     // Return the socket file for the given process.
-    private String findSocketFile(int pid, int ns_pid) {
+    private File findSocketFile(int pid, int ns_pid) {
         // A process may not exist in the same mount namespace as the caller.
         // Instead, attach relative to the target root filesystem as exposed by
         // procfs regardless of namespaces.
         String root = "/proc/" + pid + "/root/" + tmpdir;
-        File f = new File(root, ".java_pid" + ns_pid);
-        if (!f.exists()) {
-            return null;
-        }
-        return f.getPath();
+        return new File(root, ".java_pid" + ns_pid);
     }
 
     // On Solaris/Linux a simple handshake is used to start the attach mechanism