test/jdk/java/lang/ProcessHandle/OnExitTest.java
author herrick
Mon, 14 Oct 2019 14:36:45 -0400
branchJDK-8200758-branch
changeset 58584 910b14f4fe3a
parent 49258 be0ec3cc0c2a
permissions -rw-r--r--
8232042: [macos] Installation fails if application name contains spaces Submitted-by: almatvee Reviewed-by: aherrick, asemenyuk
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
49258
be0ec3cc0c2a 8199616: Fix @module declarations in tier1 tests
shurailine
parents: 47706
diff changeset
    44
 * @modules jdk.management
45466
faf1c55d2046 8181759: add explicit @build actions for jdk.test.lib classes in all :tier1 tests
iignatyev
parents: 44640
diff changeset
    45
 * @build jdk.test.lib.Utils
34891
dc0cab2e79cd 8146574: (process) ProcessHandle test cleanup
rriggs
parents: 33648
diff changeset
    46
 * @run testng OnExitTest
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    47
 * @summary Functions of Process.onExit and ProcessHandle.onExit
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    48
 * @author Roger Riggs
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
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    51
public class OnExitTest extends ProcessUtil {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    52
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    53
    @SuppressWarnings("raw_types")
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    54
    public static void main(String[] args) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    55
        Class<?>[] testclass = { OnExitTest.class};
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    56
        TestNG testng = new TestNG();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    57
        testng.setTestClasses(testclass);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    58
        testng.run();
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
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    62
     * Basic test of exitValue and onExit.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    63
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    64
    @Test
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    65
    public static void test1() {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    66
        try {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    67
            int[] exitValues = {0, 1, 10};
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    68
            for (int value : exitValues) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    69
                Process p = JavaChild.spawn("exit", Integer.toString(value));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    70
                CompletableFuture<Process> future = p.onExit();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    71
                future.thenAccept( (ph) -> {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    72
                    int actualExitValue = ph.exitValue();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    73
                    printf(" javaChild done: %s, exitStatus: %d%n",
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    74
                            ph, actualExitValue);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    75
                    Assert.assertEquals(actualExitValue, value, "actualExitValue incorrect");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    76
                    Assert.assertEquals(ph, p, "Different Process passed to thenAccept");
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
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    79
                Process h = future.get();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    80
                Assert.assertEquals(h, p);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    81
                Assert.assertEquals(p.exitValue(), value);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    82
                Assert.assertFalse(p.isAlive(), "Process should not be alive");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    83
                p.waitFor();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    84
            }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    85
        } catch (IOException | InterruptedException | ExecutionException ex) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    86
            Assert.fail(ex.getMessage(), ex);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    87
        } finally {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    88
            destroyProcessTree(ProcessHandle.current());
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
    /**
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    93
     * Test of Completion handler when parent is killed.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    94
     * Spawn 1 child to spawn 3 children each with 2 children.
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    95
     */
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    96
    @Test
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    97
    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
    98
        ProcessHandle procHandle = null;
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
    99
        try {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   100
            ConcurrentHashMap<ProcessHandle, ProcessHandle> processes = new ConcurrentHashMap<>();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   101
            List<ProcessHandle> children = getChildren(ProcessHandle.current());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   102
            children.forEach(ProcessUtil::printProcess);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   103
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   104
            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
   105
            procHandle = proc.toHandle();
44640
590dec7cadb4 8178347: Process and ProcessHandle getPid method name inconsistency
rriggs
parents: 44269
diff changeset
   106
            printf(" spawned: %d%n", proc.pid());
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   107
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   108
            proc.forEachOutputLine((s) -> {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   109
                String[] split = s.trim().split(" ");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   110
                if (split.length == 3 && split[1].equals("spawn")) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   111
                    Long child = Long.valueOf(split[2]);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   112
                    Long parent = Long.valueOf(split[0].split(":")[0]);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   113
                    processes.put(ProcessHandle.of(child).get(), ProcessHandle.of(parent).get());
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
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   117
            proc.sendAction("spawn", "3", "stdin");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   118
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   119
            proc.sendAction("child", "spawn", "2", "stdin");
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   120
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   121
            // Poll until all 9 child processes exist or the timeout is reached
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   122
            int expected = 9;
31537
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   123
            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
   124
            Instant endTimeout = Instant.now().plusSeconds(timeout);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   125
            do {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   126
                Thread.sleep(200L);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   127
                printf(" subprocess count: %d, waiting for %d%n", processes.size(), expected);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   128
            } while (processes.size() < expected &&
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   129
                    Instant.now().isBefore(endTimeout));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   130
32209
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31537
diff changeset
   131
            if (processes.size() < expected) {
24bb680a1609 8131168: Refactor ProcessHandleImpl_*.c and add implememtation for AIX
simonis
parents: 31537
diff changeset
   132
                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
   133
                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
   134
                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
   135
            }
33648
9564031a20e0 8138566: (Process) java.lang.Process.allChildren specification clarification
rriggs
parents: 32657
diff changeset
   136
            children = getDescendants(procHandle);
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   137
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   138
            ConcurrentHashMap<ProcessHandle, CompletableFuture<ProcessHandle>> completions =
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   139
                    new ConcurrentHashMap<>();
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   140
            Instant startTime = Instant.now();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   141
            // Create a future for each of the 9 children
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   142
            processes.forEach( (p, parent) -> {
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   143
                        CompletableFuture<ProcessHandle> cf = p.onExit().whenComplete((ph, ex) -> {
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   144
                            Duration elapsed = Duration.between(startTime, Instant.now());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   145
                            printf("whenComplete: pid: %s, exception: %s, thread: %s, elapsed: %s%n",
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   146
                                    ph, ex, Thread.currentThread(), elapsed);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   147
                        });
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   148
                        completions.put(p, cf);
30899
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
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   151
            // Check that each of the spawned processes is included in the children
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   152
            List<ProcessHandle> remaining = new ArrayList<>(children);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   153
            processes.forEach((p, parent) -> {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   154
                Assert.assertTrue(remaining.remove(p), "spawned process should have been in children");
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
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   157
            // Remove Win32 system spawned conhost.exe processes
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   158
            remaining.removeIf(ProcessUtil::isWindowsConsole);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   159
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   160
            remaining.forEach(p -> printProcess(p, "unexpected: "));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   161
            if (remaining.size() > 0) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   162
                // Show full list for debugging
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   163
                ProcessUtil.logTaskList();
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
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   166
            proc.destroy();  // kill off the parent
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   167
            proc.waitFor();
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   168
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   169
            // 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
   170
            processes.forEach((p, parent) -> {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   171
                try {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   172
                    p.onExit().get();
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   173
                    completions.get(p).join();
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   174
                } catch (InterruptedException | ExecutionException ex) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   175
                    // ignore
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
            });
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   178
31532
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   179
            // 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
   180
            processes.forEach((p, parent) -> {
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   181
                ProcessHandle value = completions.get(p).getNow(null);
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   182
                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
   183
                        + ", actual: " + value
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   184
                        + ": " + p.info());
c1e1214cebd3 8085981: java/lang/ProcessHandle/OnExitTest.java: AssertionError: Child onExit not called
rriggs
parents: 31182
diff changeset
   185
            });
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   186
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   187
            // Show the status of the original children
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   188
            children.forEach(p -> printProcess(p, "after onExit:"));
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   189
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   190
            Assert.assertEquals(proc.isAlive(), false, "destroyed process is alive:: %s%n" + proc);
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   191
        } catch (IOException | InterruptedException ex) {
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   192
            Assert.fail(ex.getMessage());
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   193
        } finally {
31537
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   194
            if (procHandle != null) {
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   195
                destroyProcessTree(procHandle);
704fd18b5be1 8130296: [TESTBUG] java/lang/ProcessHandle/OnExitTest - Unaccounted for children expected [0] but found [1]
rriggs
parents: 31532
diff changeset
   196
            }
30899
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
    }
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   199
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   200
    /**
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   201
     * 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
   202
     * the process has exited.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   203
     * 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
   204
     * 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
   205
     * Command (A) to exit.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   206
     * 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
   207
     */
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   208
    @Test
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   209
    public static void peerOnExitTest() {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   210
        String line = null;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   211
        ArrayBlockingQueue<String> alines = new ArrayBlockingQueue<>(100);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   212
        ArrayBlockingQueue<String> blines = new ArrayBlockingQueue<>(100);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   213
        JavaChild A = null;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   214
        try {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   215
            String[] split;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   216
            A = JavaChild.spawnJavaChild("stdin");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   217
            A.forEachOutputLine(l -> alines.add(l));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   218
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   219
            // Verify A is running
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   220
            A.sendAction("pid");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   221
            do {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   222
                split = getSplitLine(alines);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   223
            } while (!"pid".equals(split[1]));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   224
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   225
            JavaChild B = null;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   226
            try {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   227
                B = JavaChild.spawnJavaChild("stdin");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   228
                B.forEachOutputLine(l -> blines.add(l));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   229
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   230
                // Verify B is running
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   231
                B.sendAction("pid");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   232
                do {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   233
                    split = getSplitLine(blines);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   234
                } while (!"pid".equals(split[1]));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   235
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   236
                // Tell B to wait for A's pid
44640
590dec7cadb4 8178347: Process and ProcessHandle getPid method name inconsistency
rriggs
parents: 44269
diff changeset
   237
                B.sendAction("waitpid", A.pid());
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   238
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   239
                // 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
   240
                try {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   241
                    line = blines.poll(5L, TimeUnit.SECONDS);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   242
                } catch (InterruptedException ie) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   243
                    Assert.fail("interrupted", ie);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   244
                }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   245
                Assert.assertNull(line, "waitpid didn't wait");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   246
45717
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   247
                A.toHandle().onExit().thenAccept(p -> {
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   248
                    System.out.printf(" A.toHandle().onExit().A info: %s, now: %s%n",
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   249
                            p.info(), Instant.now());
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   250
                });
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   251
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   252
                A.onExit().thenAccept(p -> {
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   253
                    System.out.printf(" A.onExit().A info: %s, now: %s%n",
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   254
                            p.info(), Instant.now());
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   255
                });
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   256
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   257
                ProcessHandle.Info A_info = A.info();
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   258
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   259
                A.sendAction("exit", 0L);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   260
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   261
                // 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
   262
                do {
45717
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   263
                    Instant start = Instant.now();
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   264
                    while (blines.isEmpty() && A.isAlive()) {
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   265
                        A_info = A.info(); // Spin
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   266
                    }
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   267
                    Instant end = Instant.now();
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   268
                    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
   269
                            Duration.between(start, end));
83b617bc344a 8183019: Diagnostics for onExitTest
rriggs
parents: 45565
diff changeset
   270
44269
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   271
                    split = getSplitLine(blines);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   272
                } while (!"waitpid".equals(split[1]));
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   273
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   274
                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
   275
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   276
                B.sendAction("exit", 0L);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   277
            } catch (IOException ioe) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   278
                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
   279
            } finally {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   280
                B.destroyForcibly();
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   281
            }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   282
        } catch (IOException ioe2) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   283
            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
   284
        } finally {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   285
            A.destroyForcibly();
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
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   289
    private static boolean DEBUG = true;
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
    /**
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   292
     * 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
   293
     * Log to stdout if requested.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   294
     * @param queue a queue of strings
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   295
     * @return the words split from the line.
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   296
     */
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   297
    private static String[] getSplitLine(ArrayBlockingQueue<String> queue) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   298
        try {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   299
            String line = queue.take();
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   300
            String[] split = line.split("\\s");
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   301
            if (DEBUG) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   302
                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
   303
            }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   304
            return split;
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   305
        } catch (InterruptedException ie) {
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   306
            Assert.fail("interrupted", ie);
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   307
            return null;
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
    }
762b2df849b3 8176272: (process) ProcessHandle::onExit fails to wait for non-child process
rriggs
parents: 40686
diff changeset
   310
30899
d2408e757489 8077350: JEP 102 Process API Updates Implementation
rriggs
parents:
diff changeset
   311
}