summaryrefslogtreecommitdiffstats
path: root/net/test
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-06 07:42:29 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-06 07:42:29 +0000
commit4a1e819ef2ea392f5c8168875ee6b39ca799c69f (patch)
tree17bd4e4cf32f5d04934962b10b541f06c6bbe72d /net/test
parent1576526232e5526b80a664196b381c1d4ef59514 (diff)
downloadchromium_src-4a1e819ef2ea392f5c8168875ee6b39ca799c69f.zip
chromium_src-4a1e819ef2ea392f5c8168875ee6b39ca799c69f.tar.gz
chromium_src-4a1e819ef2ea392f5c8168875ee6b39ca799c69f.tar.bz2
Fix flaky thread number DCHECK in KioskTest.
EmbeddedTestServer::StopThread might be returned before GetNumberOfThreads gets an updated thread number. Add a busy loop to wait for it to update. BUG=322732 Review URL: https://codereview.chromium.org/105823002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@239141 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/test')
-rw-r--r--net/test/embedded_test_server/embedded_test_server.cc20
-rw-r--r--net/test/embedded_test_server/embedded_test_server.h12
2 files changed, 27 insertions, 5 deletions
diff --git a/net/test/embedded_test_server/embedded_test_server.cc b/net/test/embedded_test_server/embedded_test_server.cc
index aacecd2..b60cea4 100644
--- a/net/test/embedded_test_server/embedded_test_server.cc
+++ b/net/test/embedded_test_server/embedded_test_server.cc
@@ -9,6 +9,7 @@
#include "base/files/file_path.h"
#include "base/message_loop/message_loop.h"
#include "base/path_service.h"
+#include "base/process/process_metrics.h"
#include "base/run_loop.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
@@ -128,10 +129,29 @@ bool EmbeddedTestServer::InitializeAndWaitUntilReady() {
}
void EmbeddedTestServer::StopThread() {
+ DCHECK(io_thread_ && io_thread_->IsRunning());
+
+#if defined(OS_LINUX)
+ const int thread_count =
+ base::GetNumberOfThreads(base::GetCurrentProcessHandle());
+#endif
+
io_thread_->Stop();
io_thread_.reset();
thread_checker_.DetachFromThread();
listen_socket_->DetachFromThread();
+
+#if defined(OS_LINUX)
+ // Busy loop to wait for thread count to decrease. This is needed because
+ // pthread_join does not guarantee that kernel stat is updated when it
+ // returns. Thus, GetNumberOfThreads does not immediately reflect the stopped
+ // thread and hits the thread number DCHECK in render_sandbox_host_linux.cc
+ // in browser_tests.
+ while (thread_count ==
+ base::GetNumberOfThreads(base::GetCurrentProcessHandle())) {
+ base::PlatformThread::YieldCurrentThread();
+ }
+#endif
}
void EmbeddedTestServer::RestartThreadAndListen() {
diff --git a/net/test/embedded_test_server/embedded_test_server.h b/net/test/embedded_test_server/embedded_test_server.h
index 5600e0f..1232388 100644
--- a/net/test/embedded_test_server/embedded_test_server.h
+++ b/net/test/embedded_test_server/embedded_test_server.h
@@ -73,22 +73,24 @@ class HttpListenSocket : public TCPListenSocket {
// return http_response.Pass();
// }
//
-// For a test that spawns another process such as browser_tests, you
-// need to stop the server's thread so that there is no no other
+// For a test that spawns another process such as browser_tests, it is
+// suggested to call InitializeAndWaitUntilReady in SetUpOnMainThread after
+// the process is spawned. If you have to do it before the process spawns,
+// you need to stop the server's thread so that there is no no other
// threads running while spawning the process. To do so, please follow
// the following example:
//
// void SetUp() {
-// test_server_.reset(new EmbeddedTestServer());
+// ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
// // EmbeddedTestServer spawns a thread to initialize socket.
// // Stop the thread in preparation for fork and exec.
-// test_server_->StopThread();
+// embedded_test_server()->StopThread();
// ...
// InProcessBrowserTest::SetUp();
// }
//
// void SetUpOnMainThread() {
-// test_server_->RestartThreadAndListen();
+// embedded_test_server()->RestartThreadAndListen();
// }
//
class EmbeddedTestServer : public StreamListenSocket::Delegate {