diff options
author | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-06 07:42:29 +0000 |
---|---|---|
committer | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-06 07:42:29 +0000 |
commit | 4a1e819ef2ea392f5c8168875ee6b39ca799c69f (patch) | |
tree | 17bd4e4cf32f5d04934962b10b541f06c6bbe72d /net/test | |
parent | 1576526232e5526b80a664196b381c1d4ef59514 (diff) | |
download | chromium_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.cc | 20 | ||||
-rw-r--r-- | net/test/embedded_test_server/embedded_test_server.h | 12 |
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 { |