< prev index next >

test/vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001.java

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 2004, 2018, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2019, 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.

@@ -26,11 +26,44 @@
 import java.io.PrintStream;
 
 import nsk.share.*;
 import nsk.share.jvmti.*;
 
-//    THIS TEST IS LINE NUMBER SENSITIVE
+//    THIS CLASS IS LINE NUMBER SENSITIVE
+
+class tc02t001Thread extends Thread {
+    public Wicket startingBarrier = new Wicket();
+    public Wicket waitingBarrier1 = new Wicket();
+    public Wicket waitingBarrier2 = new Wicket();
+    public Wicket waitingBarrier3 = new Wicket();
+    public Object M = new Object();
+
+    public tc02t001Thread(String name) {
+        super(name);
+    }
+
+    public void run() {
+        startingBarrier.unlock();
+
+        waitingBarrier1.waitFor();
+        synchronized (M) { // tc02t001.c::lines[0]
+            M.notify();
+        }
+
+        waitingBarrier2.waitFor();
+        synchronized (M) { // tc02t001.c::lines[1]
+            M.notify();
+        }
+
+        waitingBarrier3.waitFor();
+        synchronized (M) { // tc02t001.c::lines[2]
+            M.notify();
+        }
+    }
+}
+
+/* =================================================================== */
 
 public class tc02t001 extends DebugeeClass {
 
     // run test from command line
     public static void main(String argv[]) {

@@ -51,13 +84,37 @@
     ArgumentHandler argHandler = null;
     Log log = null;
     int status = Consts.TEST_PASSED;
     static long timeout = 0;
 
+    private static volatile int lastEnterEventsCount;
+    private static native   int enterEventsCount();
+
     // tested thread
     tc02t001Thread thread = null;
 
+    static void log (String msg) { System.out.println(msg); }
+
+    private void waitForContendedEnterEvent() {
+        try {
+            for (int j = 0; j < (timeout / 20); j++) {
+                Thread.sleep(20);
+                if (enterEventsCount() > lastEnterEventsCount) {
+                    log("Got expected MonitorContendedEnter event\n");
+                    break;
+                }
+            }
+            if (enterEventsCount() == lastEnterEventsCount) {
+                String msg = "Timeout in waiting for a MonitorContendedEnter event";
+                throw new RuntimeException(msg);
+            }
+            thread.M.wait(timeout);
+        } catch (InterruptedException e) {
+            throw new Failure(e);
+        }
+    }
+
     // run debuggee
     public int runIt(String argv[], PrintStream out) {
         argHandler = new ArgumentHandler(argv);
         log = new Log(out, argHandler);
         timeout = argHandler.getWaitTime() * 60 * 1000;

@@ -67,33 +124,24 @@
         synchronized (thread.M) {
             thread.start();
             thread.startingBarrier.waitFor();
             status = checkStatus(status);
 
+            lastEnterEventsCount = enterEventsCount();
             thread.waitingBarrier1.unlock();
-            try {
-                Thread.sleep(1000); // Wait for contended "synchronized (M)"
-                thread.M.wait(timeout);
-            } catch (InterruptedException e) {
-                throw new Failure(e);
-            }
+            log("Waiting for MonitorEnterEvent #1");
+            waitForContendedEnterEvent();
 
+            lastEnterEventsCount = enterEventsCount();
             thread.waitingBarrier2.unlock();
-            try {
-                Thread.sleep(1000); // Wait for contended "synchronized (M)"
-                thread.M.wait(timeout);
-            } catch (InterruptedException e) {
-                throw new Failure(e);
-            }
+            log("Waiting for MonitorEnterEvent #2");
+            waitForContendedEnterEvent();
 
+            lastEnterEventsCount = enterEventsCount();
             thread.waitingBarrier3.unlock();
-            try {
-                Thread.sleep(1000); // Wait for contended "synchronized (M)"
-                thread.M.wait(timeout);
-            } catch (InterruptedException e) {
-                throw new Failure(e);
-            }
+            log("Waiting for MonitorEnterEvent #3");
+            waitForContendedEnterEvent();
         }
 
         try {
             thread.join(timeout);
         } catch (InterruptedException e) {

@@ -104,38 +152,5 @@
         status = checkStatus(status);
 
         return status;
     }
 }
-
-/* =================================================================== */
-
-class tc02t001Thread extends Thread {
-    public Wicket startingBarrier = new Wicket();
-    public Wicket waitingBarrier1 = new Wicket();
-    public Wicket waitingBarrier2 = new Wicket();
-    public Wicket waitingBarrier3 = new Wicket();
-    public Object M = new Object();
-
-    public tc02t001Thread(String name) {
-        super(name);
-    }
-
-    public void run() {
-        startingBarrier.unlock();
-
-        waitingBarrier1.waitFor();
-        synchronized (M) { // tc02t001.c::lines[0]
-            M.notify();
-        }
-
-        waitingBarrier2.waitFor();
-        synchronized (M) { // tc02t001.c::lines[1]
-            M.notify();
-        }
-
-        waitingBarrier3.waitFor();
-        synchronized (M) { // tc02t001.c::lines[2]
-            M.notify();
-        }
-    }
-}
< prev index next >