# HG changeset patch # User wetmore # Date 1401226153 0 # Node ID 0e30add0f485766e7c64fc55f483f04828c093e8 # Parent fe841cf83d7fafaa988c95d06204544cd45a3be1# Parent b3bf9c82a050911fb5c10ee48cf9a0a391f3f45c Merge diff -r fe841cf83d7f -r 0e30add0f485 jdk/src/share/classes/com/sun/tools/hat/MANIFEST.mf --- 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 diff -r fe841cf83d7f -r 0e30add0f485 jdk/src/share/classes/com/sun/tools/hat/README.txt --- 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 diff -r fe841cf83d7f -r 0e30add0f485 jdk/src/share/classes/com/sun/tools/hat/build.xml --- 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 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -r fe841cf83d7f -r 0e30add0f485 jdk/src/share/classes/java/lang/Process.java --- 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(); + } } diff -r fe841cf83d7f -r 0e30add0f485 jdk/src/solaris/classes/java/lang/UNIXProcess.java --- 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; } diff -r fe841cf83d7f -r 0e30add0f485 jdk/src/windows/classes/java/lang/ProcessImpl.java --- 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); } diff -r fe841cf83d7f -r 0e30add0f485 jdk/src/windows/native/java/lang/ProcessImpl_md.c --- 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. */ diff -r fe841cf83d7f -r 0e30add0f485 jdk/test/java/lang/ProcessBuilder/Basic.java --- 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 {