From 1ce809f9a732b049e4c0bd7ea54d454ca48537d9 Mon Sep 17 00:00:00 2001 From: jbudorick Date: Mon, 11 May 2015 00:44:59 -0700 Subject: [Android] Fix race condition in BaseTestServer. BUG=485417 Review URL: https://codereview.chromium.org/1131803002 Cr-Commit-Position: refs/heads/master@{#329111} --- .../src/org/chromium/net/test/BaseTestServer.java | 44 ++++++++++++++++++++-- 1 file changed, 41 insertions(+), 3 deletions(-) (limited to 'net/test/android') diff --git a/net/test/android/javatests/src/org/chromium/net/test/BaseTestServer.java b/net/test/android/javatests/src/org/chromium/net/test/BaseTestServer.java index a9ca6bd..c54de3d 100644 --- a/net/test/android/javatests/src/org/chromium/net/test/BaseTestServer.java +++ b/net/test/android/javatests/src/org/chromium/net/test/BaseTestServer.java @@ -4,23 +4,54 @@ package org.chromium.net.test; +import org.chromium.base.Log; + import java.util.concurrent.atomic.AtomicBoolean; /** A base class for simple test servers. */ public abstract class BaseTestServer implements Runnable { + private static final String TAG = Log.makeTag("net.test"); + private AtomicBoolean mKeepRunning; + private final Object mLock; + private boolean mRunning; /** Creates a test server. */ public BaseTestServer() { mKeepRunning = new AtomicBoolean(true); + mLock = new Object(); } /** Accepts incoming connections until stopped via stop(). */ public void run() { - mKeepRunning.set(true); + serverHasStarted(); + + try { + while (mKeepRunning.get()) { + accept(); + } + } finally { + serverHasStopped(); + } + } - while (mKeepRunning.get()) { - accept(); + /** Waits for the server to start. */ + public void waitForServerToStart() { + synchronized (mLock) { + while (!mRunning) { + try { + mLock.wait(); + } catch (InterruptedException e) { + Log.e(TAG, "Interrupted while waiting for server to stop.", e); + } + } + } + } + + private void serverHasStarted() { + synchronized (mLock) { + mRunning = true; + mLock.notifyAll(); } } @@ -34,4 +65,11 @@ public abstract class BaseTestServer implements Runnable { public void stop() { mKeepRunning.set(false); } + + private void serverHasStopped() { + synchronized (mLock) { + mRunning = false; + mLock.notifyAll(); + } + } } -- cgit v1.1