/* * Copyright (c) 2013, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions.
*/
/** * @test * @bug 8024521 * @summary Closing ProcessPipeInputStream at the time the process exits is racy * and leads to data corruption. Run this test manually (as * an ordinary java program) with -Xmx8M to repro bug 8024521. * @run main/othervm -Xmx8M -Dtest.duration=2 CloseRace
*/
for (Threadthread : threads) thread.interrupt(); for (Threadthread : threads) { thread.join(10_000); if (thread.isAlive()) {
dumpAllStacks(); thrownew Error("At least one child thread ("
+ thread.getName()
+ ") failed to finish gracefully");
}
}
}
staticclass OpenLoop implements Runnable { publicvoid run() {
threadsStarted.countDown(); while (!Thread.interrupted()) { try { // wait for ExecLoop to finish creating process do { if (Thread.interrupted()) return;
} while (count(procFDsInUse()) != 3);
List<InputStream> iss = new ArrayList<>(4);
// eat up three "holes" (closed ends of pipe fd pairs) for (int i = 0; i < 3; i++)
iss.add(new FileInputStream(BIG_FILE)); do { if (Thread.interrupted()) return;
} while (count(procFDsInUse()) == procFDs.length); // hopefully this will racily occupy empty fd slot
iss.add(new FileInputStream(BIG_FILE)); Thread.sleep(1); // Widen race window for (InputStream is : iss)
is.close();
} catch (InterruptedException e) { break;
} catch (Exception e) { thrownew Error(e);
}
}
}
}
staticclass ExecLoop implements Runnable { publicvoid run() {
threadsStarted.countDown();
ProcessBuilder builder = new ProcessBuilder("/bin/true"); while (!Thread.interrupted()) { try { // wait for OpenLoop to finish do { if (Thread.interrupted()) return;
} while (count(procFDsInUse()) > 0);
Process process = builder.start();
InputStream is = process.getInputStream();
process.waitFor();
is.close();
} catch (InterruptedException e) { break;
} catch (Exception e) { thrownew Error(e);
}
}
}
}
}
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.