8003488: (process) Provide Process.getPid()
Summary: Add Process.getPid
Reviewed-by: alanb, martin, igerasim
--- 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();
+ }
}
--- 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;
}
--- 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);
}
--- 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. */
--- 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 {