Merge
authorjwilhelm
Wed, 07 Oct 2015 00:46:44 +0200
changeset 33056 c614815ff754
parent 33040 463fd35177fa (current diff)
parent 33043 fc7fb488b616 (diff)
child 33057 b20b9e931ac2
Merge
--- a/test/lib/share/classes/jdk/test/lib/apps/LingeredApp.java	Thu Oct 01 11:52:43 2015 -0700
+++ b/test/lib/share/classes/jdk/test/lib/apps/LingeredApp.java	Wed Oct 07 00:46:44 2015 +0200
@@ -67,6 +67,7 @@
 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 @@
         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 @@
      *  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 @@
         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);
     }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/lib/share/classes/jdk/test/lib/apps/LingeredAppWithDeadlock.java	Wed Oct 07 00:46:44 2015 +0200
@@ -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);
+    }
+ }