Merge
This commit is contained in:
commit
7c4e11070f
@ -67,6 +67,7 @@ import java.util.UUID;
|
||||
public class LingeredApp {
|
||||
|
||||
private static final long spinDelay = 1000;
|
||||
private static final int appWaitTime = 100;
|
||||
|
||||
private final String lockFileName;
|
||||
private long lockCreationTime;
|
||||
@ -111,6 +112,12 @@ public class LingeredApp {
|
||||
this.storedAppOutput = new ArrayList<String>();
|
||||
}
|
||||
|
||||
public LingeredApp() {
|
||||
final String lockName = UUID.randomUUID().toString() + ".lck";
|
||||
this.lockFileName = lockName;
|
||||
this.storedAppOutput = new ArrayList<String>();
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return name of lock file
|
||||
@ -338,21 +345,18 @@ public class LingeredApp {
|
||||
* High level interface for test writers
|
||||
*/
|
||||
/**
|
||||
* Factory method that creates SmartAppTest object with ready to use application
|
||||
* lock name is autogenerated, wait timeout is hardcoded
|
||||
* Factory method that creates LingeredApp object with ready to use application
|
||||
* lock name is autogenerated
|
||||
* @param cmd - vm options, could be null to auto add testvm.options
|
||||
* @return LingeredApp object
|
||||
* @throws IOException
|
||||
*/
|
||||
public static LingeredApp startApp(List<String> cmd) throws IOException {
|
||||
final String lockName = UUID.randomUUID().toString() + ".lck";
|
||||
final int waitTime = 10;
|
||||
|
||||
LingeredApp a = new LingeredApp(lockName);
|
||||
LingeredApp a = new LingeredApp();
|
||||
a.createLock();
|
||||
try {
|
||||
a.runApp(cmd);
|
||||
a.waitAppReady(waitTime);
|
||||
a.waitAppReady(appWaitTime);
|
||||
} catch (Exception ex) {
|
||||
a.deleteLock();
|
||||
throw ex;
|
||||
@ -361,6 +365,26 @@ public class LingeredApp {
|
||||
return a;
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory method that starts pre-created LingeredApp
|
||||
* lock name is autogenerated
|
||||
* @param cmd - vm options, could be null to auto add testvm.options
|
||||
* @param theApp - app to start
|
||||
* @return LingeredApp object
|
||||
* @throws IOException
|
||||
*/
|
||||
|
||||
public static void startApp(List<String> cmd, LingeredApp theApp) throws IOException {
|
||||
theApp.createLock();
|
||||
try {
|
||||
theApp.runApp(cmd);
|
||||
theApp.waitAppReady(appWaitTime);
|
||||
} catch (Exception ex) {
|
||||
theApp.deleteLock();
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
public static LingeredApp startApp() throws IOException {
|
||||
return startApp(null);
|
||||
}
|
||||
|
@ -0,0 +1,81 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2015, 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.
|
||||
*/
|
||||
package jdk.test.lib.apps;
|
||||
|
||||
import java.util.concurrent.Phaser;
|
||||
|
||||
public class LingeredAppWithDeadlock extends LingeredApp {
|
||||
|
||||
private static final Object Lock1 = new Object();
|
||||
private static final Object Lock2 = new Object();
|
||||
|
||||
private static volatile int reachCount = 0;
|
||||
|
||||
private static final Phaser p = new Phaser(2);
|
||||
|
||||
private static class ThreadOne extends Thread {
|
||||
public void run() {
|
||||
// wait Lock2 is locked
|
||||
p.arriveAndAwaitAdvance();
|
||||
synchronized (Lock1) {
|
||||
// signal Lock1 is locked
|
||||
p.arriveAndAwaitAdvance();
|
||||
synchronized (Lock2) {
|
||||
reachCount += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class ThreadTwo extends Thread {
|
||||
public void run() {
|
||||
synchronized (Lock2) {
|
||||
// signal Lock2 is locked
|
||||
p.arriveAndAwaitAdvance();
|
||||
// wait Lock1 is locked
|
||||
p.arriveAndAwaitAdvance();
|
||||
synchronized (Lock1) {
|
||||
reachCount += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String args[]) {
|
||||
if (args.length != 1) {
|
||||
System.err.println("Lock file name is not specified");
|
||||
System.exit(7);
|
||||
}
|
||||
|
||||
// Run two theads that should come to deadlock
|
||||
new ThreadOne().start();
|
||||
new ThreadTwo().start();
|
||||
|
||||
if (reachCount > 0) {
|
||||
// Not able to deadlock, exiting
|
||||
System.exit(3);
|
||||
}
|
||||
|
||||
LingeredApp.main(args);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user