changeset 55965:e17c9a93b505

8224555: vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001/TestDescription.java failed Summary: Improve synchronization in the test Reviewed-by: dcubed, amenkov
author sspitsyn
date Fri, 21 Jun 2019 18:20:49 -0700
parents f1e5ddb814b7
children 4d5eabe8d341
files test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001.java test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001/tc02t001.cpp
diffstat 2 files changed, 103 insertions(+), 83 deletions(-) [+]
line wrap: on
line diff
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001.java	Fri Jun 21 16:20:01 2019 -0700
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001.java	Fri Jun 21 18:20:49 2019 -0700
@@ -1,5 +1,5 @@
 /*
- * 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
@@ -28,86 +28,7 @@
 import nsk.share.*;
 import nsk.share.jvmti.*;
 
-//    THIS TEST IS LINE NUMBER SENSITIVE
-
-public class tc02t001 extends DebugeeClass {
-
-    // run test from command line
-    public static void main(String argv[]) {
-        argv = nsk.share.jvmti.JVMTITest.commonInit(argv);
-
-        // JCK-compatible exit
-        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
-    }
-
-    // run test from JCK-compatible environment
-    public static int run(String argv[], PrintStream out) {
-        return new tc02t001().runIt(argv, out);
-    }
-
-    /* =================================================================== */
-
-    // scaffold objects
-    ArgumentHandler argHandler = null;
-    Log log = null;
-    int status = Consts.TEST_PASSED;
-    static long timeout = 0;
-
-    // tested thread
-    tc02t001Thread thread = null;
-
-    // run debuggee
-    public int runIt(String argv[], PrintStream out) {
-        argHandler = new ArgumentHandler(argv);
-        log = new Log(out, argHandler);
-        timeout = argHandler.getWaitTime() * 60 * 1000;
-        log.display("Timeout = " + timeout + " msc.");
-
-        thread = new tc02t001Thread("Debuggee Thread");
-        synchronized (thread.M) {
-            thread.start();
-            thread.startingBarrier.waitFor();
-            status = checkStatus(status);
-
-            thread.waitingBarrier1.unlock();
-            try {
-                Thread.sleep(1000); // Wait for contended "synchronized (M)"
-                thread.M.wait(timeout);
-            } catch (InterruptedException e) {
-                throw new Failure(e);
-            }
-
-            thread.waitingBarrier2.unlock();
-            try {
-                Thread.sleep(1000); // Wait for contended "synchronized (M)"
-                thread.M.wait(timeout);
-            } catch (InterruptedException e) {
-                throw new Failure(e);
-            }
-
-            thread.waitingBarrier3.unlock();
-            try {
-                Thread.sleep(1000); // Wait for contended "synchronized (M)"
-                thread.M.wait(timeout);
-            } catch (InterruptedException e) {
-                throw new Failure(e);
-            }
-        }
-
-        try {
-            thread.join(timeout);
-        } catch (InterruptedException e) {
-            throw new Failure(e);
-        }
-
-        log.display("Debugee finished");
-        status = checkStatus(status);
-
-        return status;
-    }
-}
-
-/* =================================================================== */
+//    THIS CLASS IS LINE NUMBER SENSITIVE
 
 class tc02t001Thread extends Thread {
     public Wicket startingBarrier = new Wicket();
@@ -139,3 +60,97 @@
         }
     }
 }
+
+/* =================================================================== */
+
+public class tc02t001 extends DebugeeClass {
+
+    // run test from command line
+    public static void main(String argv[]) {
+        argv = nsk.share.jvmti.JVMTITest.commonInit(argv);
+
+        // JCK-compatible exit
+        System.exit(run(argv, System.out) + Consts.JCK_STATUS_BASE);
+    }
+
+    // run test from JCK-compatible environment
+    public static int run(String argv[], PrintStream out) {
+        return new tc02t001().runIt(argv, out);
+    }
+
+    /* =================================================================== */
+
+    // scaffold objects
+    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;
+        log.display("Timeout = " + timeout + " msc.");
+
+        thread = new tc02t001Thread("Debuggee Thread");
+        synchronized (thread.M) {
+            thread.start();
+            thread.startingBarrier.waitFor();
+            status = checkStatus(status);
+
+            lastEnterEventsCount = enterEventsCount();
+            thread.waitingBarrier1.unlock();
+            log("Waiting for MonitorEnterEvent #1");
+            waitForContendedEnterEvent();
+
+            lastEnterEventsCount = enterEventsCount();
+            thread.waitingBarrier2.unlock();
+            log("Waiting for MonitorEnterEvent #2");
+            waitForContendedEnterEvent();
+
+            lastEnterEventsCount = enterEventsCount();
+            thread.waitingBarrier3.unlock();
+            log("Waiting for MonitorEnterEvent #3");
+            waitForContendedEnterEvent();
+        }
+
+        try {
+            thread.join(timeout);
+        } catch (InterruptedException e) {
+            throw new Failure(e);
+        }
+
+        log.display("Debugee finished");
+        status = checkStatus(status);
+
+        return status;
+    }
+}
--- a/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001/tc02t001.cpp	Fri Jun 21 16:20:01 2019 -0700
+++ b/test/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001/tc02t001.cpp	Fri Jun 21 18:20:49 2019 -0700
@@ -1,5 +1,5 @@
 /*
- * 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
@@ -38,7 +38,7 @@
 static jthread thread = NULL;
 static jobject object_M = NULL;
 /* line numbers of "synchronized (M)" clauses in java part of the test */
-static jint lines[] = { 127, 132, 137 };
+static jint lines[] = { 48, 53, 58 };
 static volatile int enterEventsCount = 0;
 static volatile int enteredEventsCount = 0;
 
@@ -370,6 +370,11 @@
     return JNI_OK;
 }
 
+JNIEXPORT jint JNICALL
+Java_nsk_jvmti_scenarios_contention_TC02_tc02t001_enterEventsCount(JNIEnv* jni, jclass klass) {
+    return enterEventsCount;
+}
+
 /* ========================================================================== */
 
 }