Merge
authorwetmore
Tue, 27 May 2014 21:29:13 +0000
changeset 24581 0e30add0f485
parent 24580 fe841cf83d7f (current diff)
parent 24577 b3bf9c82a050 (diff)
child 24582 0ed956b39df8
Merge
jdk/src/share/classes/com/sun/tools/hat/MANIFEST.mf
jdk/src/share/classes/com/sun/tools/hat/README.txt
jdk/src/share/classes/com/sun/tools/hat/build.xml
--- a/jdk/src/share/classes/com/sun/tools/hat/MANIFEST.mf	Tue May 27 17:06:18 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: com.sun.tools.hat.Main
--- a/jdk/src/share/classes/com/sun/tools/hat/README.txt	Tue May 27 17:06:18 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
---------------
-This HAT source originally came from the http://hat.dev.java.net site.
-
-The utility has been named 'jhat' in the JDK, it is basically the same tool.
-
-Q: Where do I make changes? In the JDK or hat.dev.java.net?
-
-A: It depends on whether the change is intended for the JDK jhat version only,
-   or expected to be given back to the java.net project.
-   In general, we should putback changes to the java.net project and
-   bringover those changes to the JDK.
-
-Q: I want to build just jhat.jar instead of building entire JDK. What should I do?
-
-A: Use ant makefile (build.xml) in the current directory. This builds just the
-jhat sources and creates jhat.jar under ./build directory.
-
-To run the built jhat.jar, you can use the command:
-
-    java -jar build/jhat.jar heap_dump
--- a/jdk/src/share/classes/com/sun/tools/hat/build.xml	Tue May 27 17:06:18 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
- Copyright (c) 2005, 2008, 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.  Oracle designates this
- particular file as subject to the "Classpath" exception as provided
- by Oracle in the LICENSE file that accompanied this code.
-
- 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.
--->
-
-<!-- 
-
- The Original Code is HAT. The Initial Developer of the
- Original Code is Bill Foote, with contributions from others
- at JavaSoft/Sun.
-
--->
-
-<!-- This is an Ant project file to build Heap Analysis Tool (HAT).
-     For more information on Ant, please see http://ant.apache.org/ 
-
-     To build jhat.jar, run ant in current directory. jhat.jar is
-     built in ./build directory.
--->
-
-<project name="Java Heap Analysis Tool" default="all" basedir=".">
-
-  <!-- Property Definitions -->
-
-  <property name="app.name" value="jhat"/>
-  <property name="src.dir"  value="."/>
-  <property name="build.dir"  value="build"/>
-  <property name="classes.dir"  value="${build.dir}/classes"/>
-  <property name="dist.jar" value="${app.name}.jar"/>
-
-  <target name="prepare">
-    <mkdir dir="${build.dir}"/>
-    <mkdir dir="${classes.dir}"/>
-  </target>
-
-  <target name="clean">
-     <delete dir="${build.dir}"/>
-  </target>
-
-  <target name="compile" depends="prepare" description="Compiles the sources">
-    <javac srcdir="${src.dir}" destdir="${classes.dir}"
-           debug="on" deprecation="on">
-    </javac>
-
-  </target>
-
-  <target name="deploy" depends="compile" description="Creates a deployment bundle">
-    <delete file="${build.dir}/${dist.jar}" />
-    <mkdir dir="${classes.dir}/com/sun/tools/hat/resources" />
-    <copy todir="${classes.dir}/com/sun/tools/hat/resources">
-      <fileset dir="${src.dir}/resources" includes="*" />
-    </copy>
-
-    <jar jarfile="${build.dir}/${dist.jar}"
-         manifest="${src.dir}/MANIFEST.mf" basedir="${classes.dir}"/>
-  </target>
-
-  <target name="all" depends="deploy" description="Builds sources and deployment jar"/>
-
-</project>
--- a/jdk/src/share/classes/java/lang/Process.java	Tue May 27 17:06:18 2014 +0000
+++ b/jdk/src/share/classes/java/lang/Process.java	Tue May 27 21:29:13 2014 +0000
@@ -262,4 +262,18 @@
             return true;
         }
     }
+
+    /**
+     * Returns the native process id of the subprocess.
+     * The native process id is an identification number that the operating
+     * system assigns to the process.
+     *
+     * @return the native process id of the subprocess
+     * @throws UnsupportedOperationException if the Process implementation
+     *     does not support this operation
+     * @since 1.9
+     */
+    public long getPid() {
+        throw new UnsupportedOperationException();
+    }
 }
--- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java	Tue May 27 17:06:18 2014 +0000
+++ b/jdk/src/solaris/classes/java/lang/UNIXProcess.java	Tue May 27 21:29:13 2014 +0000
@@ -483,6 +483,11 @@
     }
 
     @Override
+    public long getPid() {
+        return pid;
+    }
+
+    @Override
     public synchronized boolean isAlive() {
         return !hasExited;
     }
--- a/jdk/src/windows/classes/java/lang/ProcessImpl.java	Tue May 27 17:06:18 2014 +0000
+++ b/jdk/src/windows/classes/java/lang/ProcessImpl.java	Tue May 27 21:29:13 2014 +0000
@@ -25,15 +25,15 @@
 
 package java.lang;
 
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.File;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileDescriptor;
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
 import java.lang.ProcessBuilder.Redirect;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
@@ -483,6 +483,14 @@
     private static native void terminateProcess(long handle);
 
     @Override
+    public long getPid() {
+        int pid = getProcessId0(handle);
+        return pid;
+    }
+
+    private static native int getProcessId0(long handle);
+
+    @Override
     public boolean isAlive() {
         return isProcessAlive(handle);
     }
--- a/jdk/src/windows/native/java/lang/ProcessImpl_md.c	Tue May 27 17:06:18 2014 +0000
+++ b/jdk/src/windows/native/java/lang/ProcessImpl_md.c	Tue May 27 21:29:13 2014 +0000
@@ -248,6 +248,17 @@
         }
 }
 
+/*
+ * Class:     java_lang_ProcessImpl
+ * Method:    getProcessId0
+ * Signature: (J)I
+ */
+JNIEXPORT jint JNICALL Java_java_lang_ProcessImpl_getProcessId0
+  (JNIEnv *env, jclass clazz, jlong handle) {
+    DWORD pid = GetProcessId((HANDLE) jlong_to_ptr(handle));
+    return (jint)pid;
+}
+
 /* Please, read about the MS inheritance problem
    http://support.microsoft.com/kb/315939
    and critical section/synchronized block solution. */
--- a/jdk/test/java/lang/ProcessBuilder/Basic.java	Tue May 27 17:06:18 2014 +0000
+++ b/jdk/test/java/lang/ProcessBuilder/Basic.java	Tue May 27 21:29:13 2014 +0000
@@ -26,7 +26,7 @@
  * @bug 4199068 4738465 4937983 4930681 4926230 4931433 4932663 4986689
  *      5026830 5023243 5070673 4052517 4811767 6192449 6397034 6413313
  *      6464154 6523983 6206031 4960438 6631352 6631966 6850957 6850958
- *      4947220 7018606 7034570 4244896 5049299
+ *      4947220 7018606 7034570 4244896 5049299 8003488
  * @summary Basic tests for Process and Environment Variable code
  * @run main/othervm/timeout=300 Basic
  * @run main/othervm/timeout=300 -Djdk.lang.Process.launchMechanism=fork Basic
@@ -1136,6 +1136,53 @@
         }
     }
 
+    static void checkProcessPid() {
+        long actualPid = 0;
+        long expectedPid = -1;
+        if (Windows.is()) {
+            String[] argsTasklist = {"tasklist.exe",  "/NH", "/FI",  "\"IMAGENAME eq tasklist.exe\""};
+            ProcessBuilder pb = new ProcessBuilder(argsTasklist);
+            try {
+                Process proc = pb.start();
+                expectedPid = proc.getPid();
+
+                String output = commandOutput(proc);
+                String[] splits = output.split("\\s+");
+                actualPid = Integer.valueOf(splits[2]);
+            } catch (Throwable t) {
+                unexpected(t);
+            }
+        } else if (Unix.is() || MacOSX.is()) {
+            String[]  shArgs = {"sh", "-c", "echo $$"};
+            ProcessBuilder pb = new ProcessBuilder(shArgs);
+            try {
+                Process proc = pb.start();
+                expectedPid = proc.getPid();
+
+                String output = commandOutput(proc);
+                String[] splits = output.split("\\s+");
+                actualPid = Integer.valueOf(splits[0]);
+            } catch (Throwable t) {
+                unexpected(t);
+            }
+        } else {
+            fail("No test for checkProcessPid on platform: " + System.getProperty("os.name"));
+            return;
+        }
+
+        equal(actualPid, expectedPid);
+
+        // Test the default implementation of Process.getPid
+        try {
+            DelegatingProcess p = new DelegatingProcess(null);
+            p.getPid();
+            fail("non-overridden Process.getPid method should throw UOE");
+        } catch (UnsupportedOperationException uoe) {
+            // correct
+        }
+
+    }
+
     private static void realMain(String[] args) throws Throwable {
         if (Windows.is())
             System.out.println("This appears to be a Windows system.");
@@ -1148,6 +1195,11 @@
         catch (Throwable t) { unexpected(t); }
 
         //----------------------------------------------------------------
+        // Basic tests for getPid()
+        //----------------------------------------------------------------
+        checkProcessPid();
+
+        //----------------------------------------------------------------
         // Basic tests for setting, replacing and deleting envvars
         //----------------------------------------------------------------
         try {