--- old/test/vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001.java 2019-09-25 13:00:25.266518569 +0300 +++ new/test/vmTestbase/nsk/jvmti/scenarios/contention/TC02/tc02t001.java 2019-09-25 13:00:25.083413872 +0300 @@ -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,7 +28,40 @@ 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 { @@ -53,9 +86,33 @@ 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); @@ -69,29 +126,20 @@ 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 { @@ -106,36 +154,3 @@ 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(); - } - } -}