8003488: (process) Provide Process.getPid()

Add Process.getPid

Reviewed-by: alanb, martin, igerasim
This commit is contained in:
Roger Riggs 2014-05-27 16:05:04 -04:00
parent bccd5e4671
commit 20e26966e1
5 changed files with 98 additions and 8 deletions

View File

@ -262,4 +262,18 @@ public abstract class Process {
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();
}
}

View File

@ -482,6 +482,11 @@ final class UNIXProcess extends Process {
return this;
}
@Override
public long getPid() {
return pid;
}
@Override
public synchronized boolean isAlive() {
return !hasExited;

View File

@ -25,15 +25,15 @@
package java.lang;
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.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.ProcessBuilder.Redirect;
import java.security.AccessController;
import java.security.PrivilegedAction;
@ -482,6 +482,14 @@ final class ProcessImpl extends Process {
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);

View File

@ -248,6 +248,17 @@ static void restoreIOEHandleState(
}
}
/*
* 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. */

View File

@ -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 @@ public class Basic {
}
}
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.");
@ -1147,6 +1194,11 @@ public class Basic {
try { testIORedirection(); }
catch (Throwable t) { unexpected(t); }
//----------------------------------------------------------------
// Basic tests for getPid()
//----------------------------------------------------------------
checkProcessPid();
//----------------------------------------------------------------
// Basic tests for setting, replacing and deleting envvars
//----------------------------------------------------------------