From d07f31723cd037a8c6bef60b234fdb4ad746f34a Mon Sep 17 00:00:00 2001 From: "evan@chromium.org" Date: Tue, 25 Aug 2009 01:09:05 +0000 Subject: linux: call g_thread_init() at relevant startup points According to glib docs, we need to do this if it's at all possible for us to hit glib on multiple threads. This may be happening when we grab plugin metadata from the file thread. Rather than explicitly depending on gthread all over the place, just put it in with the GTK dep (since anywhere we're using GTK we ought to init gthread). (Note that this is *not* initializing the GDK locking system.) BUG=18957 Review URL: http://codereview.chromium.org/174264 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@24203 0039d316-1c4b-4281-b951-d872f2087c98 --- base/process_util_unittest.cc | 56 ++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 27 deletions(-) (limited to 'base/process_util_unittest.cc') diff --git a/base/process_util_unittest.cc b/base/process_util_unittest.cc index 7b30be6..23e33ee 100644 --- a/base/process_util_unittest.cc +++ b/base/process_util_unittest.cc @@ -27,6 +27,11 @@ namespace base { class ProcessUtilTest : public MultiProcessTest { +#if defined(OS_POSIX) + public: + // Spawn a child process that counts how many file descriptors are open. + int CountOpenFDsInChild(); +#endif }; MULTIPROCESS_TEST_MAIN(SimpleChildProcess) { @@ -200,14 +205,6 @@ MULTIPROCESS_TEST_MAIN(ProcessUtilsLeakFDChildProcess) { } } - // InitLogging always opens a file at startup. - int expected_num_open_fds = 1; -#if defined(OS_LINUX) - // On Linux, '/etc/localtime' is opened before the test's main() enters. - expected_num_open_fds += 1; -#endif // defined(OS_LINUX) - num_open_files -= expected_num_open_fds; - int written = HANDLE_EINTR(write(write_pipe, &num_open_files, sizeof(num_open_files))); DCHECK_EQ(static_cast(written), sizeof(num_open_files)); @@ -216,40 +213,45 @@ MULTIPROCESS_TEST_MAIN(ProcessUtilsLeakFDChildProcess) { return 0; } -TEST_F(ProcessUtilTest, FDRemapping) { - // Open some files to check they don't get leaked to the child process. +int ProcessUtilTest::CountOpenFDsInChild() { int fds[2]; if (pipe(fds) < 0) NOTREACHED(); - int pipe_read_fd = fds[0]; - int pipe_write_fd = fds[1]; - - // open some dummy fds to make sure they don't propogate over to the - // child process. - int dev_null = open("/dev/null", O_RDONLY); - int sockets[2]; - socketpair(AF_UNIX, SOCK_STREAM, 0, sockets); file_handle_mapping_vector fd_mapping_vec; - fd_mapping_vec.push_back(std::pair(pipe_write_fd, kChildPipe)); + fd_mapping_vec.push_back(std::pair(fds[1], kChildPipe)); ProcessHandle handle = this->SpawnChild(L"ProcessUtilsLeakFDChildProcess", fd_mapping_vec, false); - ASSERT_NE(static_cast(NULL), handle); - HANDLE_EINTR(close(pipe_write_fd)); + CHECK(static_cast(NULL) != handle); + HANDLE_EINTR(close(fds[1])); // Read number of open files in client process from pipe; int num_open_files = -1; ssize_t bytes_read = - HANDLE_EINTR(read(pipe_read_fd, &num_open_files, sizeof(num_open_files))); - ASSERT_EQ(bytes_read, static_cast(sizeof(num_open_files))); - - // Make sure 0 fds are leaked to the client. - ASSERT_EQ(0, num_open_files); + HANDLE_EINTR(read(fds[0], &num_open_files, sizeof(num_open_files))); + CHECK(bytes_read == static_cast(sizeof(num_open_files))); - EXPECT_TRUE(WaitForSingleProcess(handle, 1000)); + CHECK(WaitForSingleProcess(handle, 1000)); base::CloseProcessHandle(handle); HANDLE_EINTR(close(fds[0])); + + return num_open_files; +} + +TEST_F(ProcessUtilTest, FDRemapping) { + int fds_before = CountOpenFDsInChild(); + + // open some dummy fds to make sure they don't propogate over to the + // child process. + int dev_null = open("/dev/null", O_RDONLY); + int sockets[2]; + socketpair(AF_UNIX, SOCK_STREAM, 0, sockets); + + int fds_after = CountOpenFDsInChild(); + + ASSERT_EQ(fds_after, fds_before); + HANDLE_EINTR(close(sockets[0])); HANDLE_EINTR(close(sockets[1])); HANDLE_EINTR(close(dev_null)); -- cgit v1.1