# HG changeset patch # User rriggs # Date 1401221104 14400 # Node ID b3bf9c82a050911fb5c10ee48cf9a0a391f3f45c # Parent 900196971bc307829770681ea5fa037986f9c4a8 8003488: (process) Provide Process.getPid() Summary: Add Process.getPid Reviewed-by: alanb, martin, igerasim diff -r 900196971bc3 -r b3bf9c82a050 jdk/src/share/classes/java/lang/Process.java --- a/jdk/src/share/classes/java/lang/Process.java Tue May 27 12:15:08 2014 -0700 +++ b/jdk/src/share/classes/java/lang/Process.java Tue May 27 16:05:04 2014 -0400 @@ -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 900196971bc3 -r b3bf9c82a050 jdk/src/solaris/classes/java/lang/UNIXProcess.java --- a/jdk/src/solaris/classes/java/lang/UNIXProcess.java Tue May 27 12:15:08 2014 -0700 +++ b/jdk/src/solaris/classes/java/lang/UNIXProcess.java Tue May 27 16:05:04 2014 -0400 @@ -483,6 +483,11 @@ } @Override + public long getPid() { + return pid; + } + + @Override public synchronized boolean isAlive() { return !hasExited; } diff -r 900196971bc3 -r b3bf9c82a050 jdk/src/windows/classes/java/lang/ProcessImpl.java --- a/jdk/src/windows/classes/java/lang/ProcessImpl.java Tue May 27 12:15:08 2014 -0700 +++ b/jdk/src/windows/classes/java/lang/ProcessImpl.java Tue May 27 16:05:04 2014 -0400 @@ -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 900196971bc3 -r b3bf9c82a050 jdk/src/windows/native/java/lang/ProcessImpl_md.c --- a/jdk/src/windows/native/java/lang/ProcessImpl_md.c Tue May 27 12:15:08 2014 -0700 +++ b/jdk/src/windows/native/java/lang/ProcessImpl_md.c Tue May 27 16:05:04 2014 -0400 @@ -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 900196971bc3 -r b3bf9c82a050 jdk/test/java/lang/ProcessBuilder/Basic.java --- a/jdk/test/java/lang/ProcessBuilder/Basic.java Tue May 27 12:15:08 2014 -0700 +++ b/jdk/test/java/lang/ProcessBuilder/Basic.java Tue May 27 16:05:04 2014 -0400 @@ -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 {