--- old/open/src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java 2017-12-19 09:47:46.768112894 -0500 +++ new/open/src/jdk.attach/aix/classes/sun/tools/attach/VirtualMachineImpl.java 2017-12-19 09:47:46.400091472 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * @@ -46,9 +46,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_name; /** * Attaches to the target VM @@ -69,8 +67,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); - if (path == null) { + File path = new File(tmpdir, ".java_pid" + pid); + socket_name = path.getPath(); + if (!path.exists()) { File f = createAttachFile(pid); try { sendQuitTo(pid); @@ -86,19 +85,19 @@ try { Thread.sleep(delay); } catch (InterruptedException x) { } - path = findSocketFile(pid); time_spend += delay; - if (time_spend > timeout/2 && path == null) { + if (time_spend > timeout/2 && !path.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 && !path.exists()); + if (!path.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_name, pid, + time_spend)); } } finally { f.delete(); @@ -107,14 +106,14 @@ // Check that the file owner/permission to avoid attaching to // bogus process - checkPermissions(path); + checkPermissions(socket_name); // 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_name); } finally { close(s); } @@ -264,15 +263,6 @@ } } - // Return the socket file for the given process. - private String findSocketFile(int pid) { - File f = new File(tmpdir, ".java_pid" + pid); - if (!f.exists()) { - return null; - } - return f.getPath(); - } - // On Solaris/Linux/Aix a simple handshake is used to start the attach mechanism // if not already started. The client creates a .attach_pid file in the // target VM's working directory (or temp directory), and the SIGQUIT handler --- old/open/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java 2017-12-19 09:47:47.470153760 -0500 +++ new/open/src/jdk.attach/linux/classes/sun/tools/attach/VirtualMachineImpl.java 2017-12-19 09:47:47.103132396 -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_name; /** * 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 path = findSocketFile(pid, ns_pid); + socket_name = path.getPath(); + if (!path.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 && !path.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 && !path.exists()); + if (!path.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_name, 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_name); // 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_name); } finally { close(s); } @@ -128,11 +126,6 @@ * Detach from the target VM */ public void detach() throws IOException { - synchronized (this) { - if (this.path != null) { - this.path = null; - } - } } // protocol version @@ -147,21 +140,12 @@ InputStream execute(String cmd, Object ... args) throws AgentLoadException, IOException { assert args.length <= 3; // includes null - // did we detach? - String p; - synchronized (this) { - if (this.path == null) { - throw new IOException("Detached from target VM"); - } - p = this.path; - } - // create UNIX socket int s = socket(); // connect to target VM try { - connect(s, p); + connect(s, socket_name); } catch (IOException x) { close(s); throw x; @@ -269,16 +253,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 --- old/open/src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java 2017-12-19 09:47:48.171194568 -0500 +++ new/open/src/jdk.attach/macosx/classes/sun/tools/attach/VirtualMachineImpl.java 2017-12-19 09:47:47.804173204 -0500 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, 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 @@ -45,9 +45,7 @@ // the latter can be changed by the user. // Any changes to this needs to be synchronized with HotSpot. private static final String tmpdir; - - // The patch to the socket file created by the target VM - String path; + String socket_name; /** * Attaches to the target VM @@ -68,8 +66,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); - if (path == null) { + File path = new File(tmpdir, ".java_pid" + pid); + socket_name = path.getPath(); + if (!path.exists()) { File f = createAttachFile(pid); try { sendQuitTo(pid); @@ -85,19 +84,19 @@ try { Thread.sleep(delay); } catch (InterruptedException x) { } - path = findSocketFile(pid); time_spend += delay; - if (time_spend > timeout/2 && path == null) { + if (time_spend > timeout/2 && !path.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 && !path.exists()); + if (!path.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)); + "target process %d doesn't respond within %dms " + + "or HotSpot VM not loaded", socket_name, + pid, time_spend)); } } finally { f.delete(); @@ -106,14 +105,14 @@ // Check that the file owner/permission to avoid attaching to // bogus process - checkPermissions(path); + checkPermissions(socket_name); // 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_name); } finally { close(s); } @@ -264,14 +263,6 @@ } } - // Return the socket file for the given process. - // Checks temp directory for .java_pid. - private String findSocketFile(int pid) { - String fn = ".java_pid" + pid; - File f = new File(tmpdir, fn); - return f.exists() ? f.getPath() : null; - } - /* * Write/sends the given to the target VM. String is transmitted in * UTF-8 encoding. @@ -282,7 +273,7 @@ try { b = s.getBytes("UTF-8"); } catch (java.io.UnsupportedEncodingException x) { - throw new InternalError(); + throw new InternalError(x); } VirtualMachineImpl.write(fd, b, 0, b.length); }