test/jdk/java/lang/ProcessHandle/OnExitTest.java
author rriggs
Mon, 06 Nov 2017 17:35:40 -0500
changeset 47706 5d668ad5142f
parent 47216 71c04702a3d5
child 49258 be0ec3cc0c2a
permissions -rw-r--r--
8187281: Remove intermittent from OnExitTest Reviewed-by: lancea
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     1
/*
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
     2
 * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     4
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     7
 * published by the Free Software Foundation.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     8
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    13
 * accompanied this code).
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    14
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    18
 *
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    21
 * questions.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    22
 */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    23
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    24
import java.io.IOException;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    25
import java.time.Duration;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    26
import java.time.Instant;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    27
import java.util.ArrayList;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    28
import java.util.List;
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
    29
import java.util.concurrent.ArrayBlockingQueue;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    30
import java.util.concurrent.CompletableFuture;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    31
import java.util.concurrent.ConcurrentHashMap;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    32
import java.util.concurrent.ExecutionException;
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
    33
import java.util.concurrent.TimeUnit;
31537
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
    34
34891
dc0cab2e79cd 8146574: (process) ProcessHandle test cleanup
rriggs
parents: 33648
diff changeset
    35
import jdk.test.lib.Utils;
31537
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
    36
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    37
import org.testng.annotations.Test;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    38
import org.testng.Assert;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    39
import org.testng.TestNG;
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    40
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    41
/*
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    42
 * @test
40686
1b855fa5c9c5 8157957: ClassNotFoundException: jdk.test.lib.JDKToolFinder
ctornqvi
parents: 36966
diff changeset
    43
 * @library /test/lib
45466
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 44640
diff changeset
    44
 * @build jdk.test.lib.Utils
34891
dc0cab2e79cd 8146574: (process) ProcessHandle test cleanup
rriggs
parents: 33648
diff changeset
    45
 * @run testng OnExitTest
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    46
 * @summary Functions of Process.onExit and ProcessHandle.onExit
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    47
 * @author Roger Riggs
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    48
 */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    49
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    50
public class OnExitTest extends ProcessUtil {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    51
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    52
    @SuppressWarnings("raw_types")
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    53
    public static void main(String[] args) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    54
        Class<?>[] testclass = { OnExitTest.class};
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    55
        TestNG testng = new TestNG();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    56
        testng.setTestClasses(testclass);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    57
        testng.run();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    58
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    59
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    60
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    61
     * Basic test of exitValue and onExit.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    62
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    63
    @Test
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    64
    public static void test1() {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    65
        try {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    66
            int[] exitValues = {0, 1, 10};
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    67
            for (int value : exitValues) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    68
                Process p = JavaChild.spawn("exit", Integer.toString(value));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    69
                CompletableFuture<Process> future = p.onExit();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    70
                future.thenAccept( (ph) -> {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    71
                    int actualExitValue = ph.exitValue();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    72
                    printf(" javaChild done: %s, exitStatus: %d%n",
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    73
                            ph, actualExitValue);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    74
                    Assert.assertEquals(actualExitValue, value, "actualExitValue incorrect");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    75
                    Assert.assertEquals(ph, p, "Different Process passed to thenAccept");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    76
                });
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    77
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    78
                Process h = future.get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    79
                Assert.assertEquals(h, p);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    80
                Assert.assertEquals(p.exitValue(), value);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    81
                Assert.assertFalse(p.isAlive(), "Process should not be alive");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    82
                p.waitFor();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    83
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    84
        } catch (IOException | InterruptedException | ExecutionException ex) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    85
            Assert.fail(ex.getMessage(), ex);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    86
        } finally {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    87
            destroyProcessTree(ProcessHandle.current());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    88
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    89
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    90
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    91
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    92
     * Test of Completion handler when parent is killed.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    93
     * Spawn 1 child to spawn 3 children each with 2 children.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    94
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    95
    @Test
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    96
    public static void test2() {
31537
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
    97
        ProcessHandle procHandle = null;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    98
        try {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    99
            ConcurrentHashMap<ProcessHandle, ProcessHandle> processes = new ConcurrentHashMap<>();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   100
            List<ProcessHandle> children = getChildren(ProcessHandle.current());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   101
            children.forEach(ProcessUtil::printProcess);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   102
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   103
            JavaChild proc = JavaChild.spawnJavaChild("stdin");
31537
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   104
            procHandle = proc.toHandle();
44640
590dec7cadb4 8178347: Process and ProcessHandle getPid method name inconsistency
rriggs
parents: 44269
diff changeset
   105
            printf(" spawned: %d%n", proc.pid());
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   106
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   107
            proc.forEachOutputLine((s) -> {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   108
                String[] split = s.trim().split(" ");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   109
                if (split.length == 3 && split[1].equals("spawn")) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   110
                    Long child = Long.valueOf(split[2]);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   111
                    Long parent = Long.valueOf(split[0].split(":")[0]);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   112
                    processes.put(ProcessHandle.of(child).get(), ProcessHandle.of(parent).get());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   113
                }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   114
            });
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   115
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   116
            proc.sendAction("spawn", "3", "stdin");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   117
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   118
            proc.sendAction("child", "spawn", "2", "stdin");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   119
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   120
            // Poll until all 9 child processes exist or the timeout is reached
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   121
            int expected = 9;
31537
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   122
            long timeout = Utils.adjustTimeout(10L);
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   123
            Instant endTimeout = Instant.now().plusSeconds(timeout);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   124
            do {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   125
                Thread.sleep(200L);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   126
                printf(" subprocess count: %d, waiting for %d%n", processes.size(), expected);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   127
            } while (processes.size() < expected &&
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   128
                    Instant.now().isBefore(endTimeout));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   129
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31537
diff changeset
   130
            if (processes.size() < expected) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31537
diff changeset
   131
                printf("WARNING: not all children have been started. Can't complete test.%n");
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31537
diff changeset
   132
                printf("         You can try to increase the timeout or%n");
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31537
diff changeset
   133
                printf("         you can try to use a faster VM (i.e. not a debug version).%n");
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31537
diff changeset
   134
            }
33648
9564031a20e0 8138566: (Process) java.lang.Process.allChildren specification clarification
rriggs
parents: 32657
diff changeset
   135
            children = getDescendants(procHandle);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   136
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   137
            ConcurrentHashMap<ProcessHandle, CompletableFuture<ProcessHandle>> completions =
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   138
                    new ConcurrentHashMap<>();
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   139
            Instant startTime = Instant.now();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   140
            // Create a future for each of the 9 children
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   141
            processes.forEach( (p, parent) -> {
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   142
                        CompletableFuture<ProcessHandle> cf = p.onExit().whenComplete((ph, ex) -> {
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   143
                            Duration elapsed = Duration.between(startTime, Instant.now());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   144
                            printf("whenComplete: pid: %s, exception: %s, thread: %s, elapsed: %s%n",
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   145
                                    ph, ex, Thread.currentThread(), elapsed);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   146
                        });
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   147
                        completions.put(p, cf);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   148
                    });
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   149
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   150
            // Check that each of the spawned processes is included in the children
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   151
            List<ProcessHandle> remaining = new ArrayList<>(children);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   152
            processes.forEach((p, parent) -> {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   153
                Assert.assertTrue(remaining.remove(p), "spawned process should have been in children");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   154
            });
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   155
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   156
            // Remove Win32 system spawned conhost.exe processes
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   157
            remaining.removeIf(ProcessUtil::isWindowsConsole);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   158
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   159
            remaining.forEach(p -> printProcess(p, "unexpected: "));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   160
            if (remaining.size() > 0) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   161
                // Show full list for debugging
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   162
                ProcessUtil.logTaskList();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   163
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   164
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   165
            proc.destroy();  // kill off the parent
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   166
            proc.waitFor();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   167
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   168
            // Wait for all the processes and corresponding onExit CF to be completed
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   169
            processes.forEach((p, parent) -> {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   170
                try {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   171
                    p.onExit().get();
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   172
                    completions.get(p).join();
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   173
                } catch (InterruptedException | ExecutionException ex) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   174
                    // ignore
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   175
                }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   176
            });
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   177
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   178
            // Verify that all 9 exit handlers were called with the correct ProcessHandle
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   179
            processes.forEach((p, parent) -> {
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   180
                ProcessHandle value = completions.get(p).getNow(null);
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   181
                Assert.assertEquals(p, value, "onExit.get value expected: " + p
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   182
                        + ", actual: " + value
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   183
                        + ": " + p.info());
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   184
            });
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   185
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   186
            // Show the status of the original children
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   187
            children.forEach(p -> printProcess(p, "after onExit:"));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   188
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   189
            Assert.assertEquals(proc.isAlive(), false, "destroyed process is alive:: %s%n" + proc);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   190
        } catch (IOException | InterruptedException ex) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   191
            Assert.fail(ex.getMessage());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   192
        } finally {
31537
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   193
            if (procHandle != null) {
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   194
                destroyProcessTree(procHandle);
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   195
            }
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   196
        }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   197
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   198
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   199
    /**
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   200
     * Verify that onExit completes for a non-child process only when
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   201
     * the process has exited.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   202
     * Spawn a child (A) waiting to be commanded to exit.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   203
     * Spawn a child (B) to wait for that process to exit.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   204
     * Command (A) to exit.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   205
     * Check that (B) does not complete until (A) has exited.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   206
     */
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   207
    @Test
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   208
    public static void peerOnExitTest() {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   209
        String line = null;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   210
        ArrayBlockingQueue<String> alines = new ArrayBlockingQueue<>(100);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   211
        ArrayBlockingQueue<String> blines = new ArrayBlockingQueue<>(100);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   212
        JavaChild A = null;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   213
        try {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   214
            String[] split;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   215
            A = JavaChild.spawnJavaChild("stdin");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   216
            A.forEachOutputLine(l -> alines.add(l));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   217
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   218
            // Verify A is running
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   219
            A.sendAction("pid");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   220
            do {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   221
                split = getSplitLine(alines);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   222
            } while (!"pid".equals(split[1]));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   223
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   224
            JavaChild B = null;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   225
            try {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   226
                B = JavaChild.spawnJavaChild("stdin");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   227
                B.forEachOutputLine(l -> blines.add(l));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   228
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   229
                // Verify B is running
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   230
                B.sendAction("pid");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   231
                do {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   232
                    split = getSplitLine(blines);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   233
                } while (!"pid".equals(split[1]));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   234
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   235
                // Tell B to wait for A's pid
44640
590dec7cadb4 8178347: Process and ProcessHandle getPid method name inconsistency
rriggs
parents: 44269
diff changeset
   236
                B.sendAction("waitpid", A.pid());
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   237
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   238
                // Wait a bit to see if B will prematurely report the termination of A
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   239
                try {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   240
                    line = blines.poll(5L, TimeUnit.SECONDS);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   241
                } catch (InterruptedException ie) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   242
                    Assert.fail("interrupted", ie);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   243
                }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   244
                Assert.assertNull(line, "waitpid didn't wait");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   245
45717
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   246
                A.toHandle().onExit().thenAccept(p -> {
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   247
                    System.out.printf(" A.toHandle().onExit().A info: %s, now: %s%n",
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   248
                            p.info(), Instant.now());
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   249
                });
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   250
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   251
                A.onExit().thenAccept(p -> {
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   252
                    System.out.printf(" A.onExit().A info: %s, now: %s%n",
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   253
                            p.info(), Instant.now());
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   254
                });
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   255
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   256
                ProcessHandle.Info A_info = A.info();
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   257
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   258
                A.sendAction("exit", 0L);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   259
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   260
                // Look for B to report that A has exited
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   261
                do {
45717
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   262
                    Instant start = Instant.now();
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   263
                    while (blines.isEmpty() && A.isAlive()) {
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   264
                        A_info = A.info(); // Spin
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   265
                    }
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   266
                    Instant end = Instant.now();
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   267
                    System.out.printf(" a.isAlive: %s, a.info: %s, @%s%n", A.isAlive(), A.info(),
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   268
                            Duration.between(start, end));
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   269
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   270
                    split = getSplitLine(blines);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   271
                } while (!"waitpid".equals(split[1]));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   272
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   273
                Assert.assertEquals(split[2], "false",  "Process A should not be alive");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   274
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   275
                B.sendAction("exit", 0L);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   276
            } catch (IOException ioe) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   277
                Assert.fail("unable to start JavaChild B", ioe);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   278
            } finally {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   279
                B.destroyForcibly();
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   280
            }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   281
        } catch (IOException ioe2) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   282
            Assert.fail("unable to start JavaChild A", ioe2);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   283
        } finally {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   284
            A.destroyForcibly();
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   285
        }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   286
    }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   287
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   288
    private static boolean DEBUG = true;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   289
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   290
    /**
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   291
     * Get a line from the queue and split into words on whitespace.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   292
     * Log to stdout if requested.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   293
     * @param queue a queue of strings
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   294
     * @return the words split from the line.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   295
     */
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   296
    private static String[] getSplitLine(ArrayBlockingQueue<String> queue) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   297
        try {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   298
            String line = queue.take();
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   299
            String[] split = line.split("\\s");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   300
            if (DEBUG) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   301
                System.out.printf("  Child Output: %s%n", line);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   302
            }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   303
            return split;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   304
        } catch (InterruptedException ie) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   305
            Assert.fail("interrupted", ie);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   306
            return null;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   307
        }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   308
    }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   309
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   310
}