Index: net/tools/quic/test_tools/server_thread.cc |
diff --git a/net/tools/quic/test_tools/server_thread.cc b/net/tools/quic/test_tools/server_thread.cc |
index ecc8ccdd61c8a2a80ef59763d122b51831760a39..e2b6506d17aae2931b1e2939b6017b021d348b78 100644 |
--- a/net/tools/quic/test_tools/server_thread.cc |
+++ b/net/tools/quic/test_tools/server_thread.cc |
@@ -15,33 +15,48 @@ ServerThread::ServerThread(IPEndPoint address, |
const QuicVersionVector& supported_versions, |
bool strike_register_no_startup_period) |
: SimpleThread("server_thread"), |
- listening_(true, false), |
confirmed_(true, false), |
+ pause_(true, false), |
+ paused_(true, false), |
+ resume_(true, false), |
quit_(true, false), |
server_(config, supported_versions), |
address_(address), |
- port_(0) { |
+ port_(0), |
+ initialized_(false) { |
if (strike_register_no_startup_period) { |
server_.SetStrikeRegisterNoStartupPeriod(); |
} |
} |
-ServerThread::~ServerThread() { |
-} |
+ServerThread::~ServerThread() {} |
+ |
+void ServerThread::Initialize() { |
+ if (initialized_) { |
+ return; |
+ } |
-void ServerThread::Run() { |
server_.Listen(address_); |
port_lock_.Acquire(); |
port_ = server_.port(); |
port_lock_.Release(); |
- listening_.Signal(); |
+ initialized_ = true; |
+} |
+ |
+void ServerThread::Run() { |
+ if (!initialized_) { |
+ Initialize(); |
+ } |
+ |
while (!quit_.IsSignaled()) { |
- event_loop_mu_.Acquire(); |
+ if (pause_.IsSignaled() && !resume_.IsSignaled()) { |
+ paused_.Signal(); |
+ resume_.Wait(); |
+ } |
server_.WaitForEvents(); |
MaybeNotifyOfHandshakeConfirmation(); |
- event_loop_mu_.Release(); |
} |
server_.Shutdown(); |
@@ -51,11 +66,7 @@ int ServerThread::GetPort() { |
port_lock_.Acquire(); |
int rc = port_; |
port_lock_.Release(); |
- return rc; |
-} |
- |
-void ServerThread::WaitForServerStartup() { |
- listening_.Wait(); |
+ return rc; |
} |
void ServerThread::WaitForCryptoHandshakeConfirmed() { |
@@ -63,15 +74,21 @@ void ServerThread::WaitForCryptoHandshakeConfirmed() { |
} |
void ServerThread::Pause() { |
- event_loop_mu_.Acquire(); |
+ DCHECK(!pause_.IsSignaled()); |
+ pause_.Signal(); |
+ paused_.Wait(); |
} |
void ServerThread::Resume() { |
- event_loop_mu_.AssertAcquired(); // Checks the calling thread only! |
- event_loop_mu_.Release(); |
+ DCHECK(!resume_.IsSignaled()); |
+ DCHECK(pause_.IsSignaled()); |
+ resume_.Signal(); |
} |
void ServerThread::Quit() { |
+ if (pause_.IsSignaled() && !resume_.IsSignaled()) { |
+ resume_.Signal(); |
+ } |
quit_.Signal(); |
} |