diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/Wicket.java b/test/hotspot/jtreg/vmTestbase/nsk/share/Wicket.java index 20a7a628bd8..5cb4ff80b16 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/Wicket.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/Wicket.java @@ -116,8 +116,8 @@ public Wicket(int count) { public void waitFor() { long id = System.currentTimeMillis(); + lock.lock(); try { - lock.lock(); ++waiters; if (debugOutput != null) { debugOutput.printf("Wicket %d %s: waitFor(). There are %d waiters totally now.\n", id, name, waiters); @@ -172,8 +172,8 @@ public int waitFor(long timeout) { long id = System.currentTimeMillis(); + lock.lock(); try { - lock.lock(); ++waiters; if (debugOutput != null) { debugOutput.printf("Wicket %d %s: waitFor(). There are %d waiters totally now.\n", id, name, waiters); @@ -209,8 +209,8 @@ public int waitFor(long timeout) { */ public void unlock() { + lock.lock(); try { - lock.lock(); if (count == 0) throw new IllegalStateException("locks are already open"); @@ -241,8 +241,8 @@ public void unlockAll() { debugOutput.printf("Wicket %s: unlockAll()\n", name); } + lock.lock(); try { - lock.lock(); count = 0; condition.signalAll(); } finally { @@ -257,8 +257,9 @@ public void unlockAll() { * @return number of waiters */ public int getWaiters() { + + lock.lock(); try { - lock.lock(); if (debugOutput != null) { debugOutput.printf("Wicket %s: getWaiters()\n", name); } diff --git a/test/hotspot/jtreg/vmTestbase/nsk/share/runner/ThreadsRunner.java b/test/hotspot/jtreg/vmTestbase/nsk/share/runner/ThreadsRunner.java index 4c5c9591776..79fe822d18f 100644 --- a/test/hotspot/jtreg/vmTestbase/nsk/share/runner/ThreadsRunner.java +++ b/test/hotspot/jtreg/vmTestbase/nsk/share/runner/ThreadsRunner.java @@ -22,7 +22,6 @@ */ package nsk.share.runner; -import nsk.share.Wicket; import nsk.share.gc.OOMStress; import nsk.share.log.*; import nsk.share.test.Stresser; @@ -45,7 +44,7 @@ public class ThreadsRunner implements MultiRunner, LogAware, RunParamsAware { private RunParams runParams; private List runnables = new ArrayList(); private List threads = new ArrayList(); - private Wicket wicket = new Wicket(); + private AtomicInteger notStarted; private AtomicInteger finished; private boolean started = false; private boolean successful = true; @@ -97,7 +96,10 @@ public ManagedThread(ManagedThreadFactory threadFactory, Runnable test, int num) @Override public void run() { - wicket.waitFor(); + notStarted.decrementAndGet(); + while (notStarted.get() != 0) { + Thread.onSpinWait(); + } try { stresser.start(runParams.getIterations()); while (!this.thread.isInterrupted() && stresser.iteration()) { @@ -187,6 +189,7 @@ private void prepare() { private void create() { int threadCount = runnables.size(); + notStarted = new AtomicInteger(threadCount); finished = new AtomicInteger(threadCount); ManagedThreadFactory factory = ManagedThreadFactory.createFactory(runParams); for (int i = 0; i < threadCount; ++i) { @@ -208,7 +211,6 @@ public void start() { log.debug("Starting " + t); t.start(); } - wicket.unlock(); started = true; }