summaryrefslogtreecommitdiffstats
path: root/net/tools/quic/test_tools/server_thread.cc
diff options
context:
space:
mode:
Diffstat (limited to 'net/tools/quic/test_tools/server_thread.cc')
-rw-r--r--net/tools/quic/test_tools/server_thread.cc49
1 files changed, 33 insertions, 16 deletions
diff --git a/net/tools/quic/test_tools/server_thread.cc b/net/tools/quic/test_tools/server_thread.cc
index ecc8ccd..e2b6506 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();
}