From b31e17107cfe5fe34e952657b846b1f93f568e88 Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Mon, 18 Apr 2016 11:09:28 -0700 Subject: [PATCH 1/2] adb: increase the FD table size on Win32. 128 maximum FDs is a pretty low limit, which can easily be exhausted by port forwarding. Bump the maximum up to 2048, and add a test that checks whether we can actually use a few hundred sockets. Bug: https://code.google.com/p/android/issues/detail?id=12141 Bug: http://b/28246942 Change-Id: Ia4a2ff776e8e58ec13378756f19d80392679ece9 --- adb/sysdeps_test.cpp | 29 +++++++++++++++++++++++++++++ adb/sysdeps_win32.cpp | 2 +- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/adb/sysdeps_test.cpp b/adb/sysdeps_test.cpp index 78efea8ad..f0c334ef2 100644 --- a/adb/sysdeps_test.cpp +++ b/adb/sysdeps_test.cpp @@ -215,3 +215,32 @@ TEST_F(sysdeps_poll, disconnect) { // Linux returns POLLIN | POLLHUP, Windows returns just POLLHUP. EXPECT_EQ(POLLHUP, pfd.revents & POLLHUP); } + +TEST_F(sysdeps_poll, fd_count) { + // https://code.google.com/p/android/issues/detail?id=12141 + static constexpr int num_sockets = 512; + std::vector sockets; + std::vector pfds; + sockets.resize(num_sockets * 2); + for (int32_t i = 0; i < num_sockets; ++i) { + ASSERT_EQ(0, adb_socketpair(&sockets[i * 2])) << strerror(errno); + ASSERT_TRUE(WriteFdExactly(sockets[i * 2], &i, sizeof(i))); + adb_pollfd pfd; + pfd.events = POLLIN; + pfd.fd = sockets[i * 2 + 1]; + pfds.push_back(pfd); + } + + ASSERT_EQ(num_sockets, adb_poll(pfds.data(), pfds.size(), 0)); + for (int i = 0; i < num_sockets; ++i) { + ASSERT_NE(0, pfds[i].revents & POLLIN); + + int32_t buf[2] = { -1, -1 }; + ASSERT_EQ(adb_read(pfds[i].fd, buf, sizeof(buf)), static_cast(sizeof(int32_t))); + ASSERT_EQ(i, buf[0]); + } + + for (int fd : sockets) { + adb_close(fd); + } +} diff --git a/adb/sysdeps_win32.cpp b/adb/sysdeps_win32.cpp index a2f34fbb4..bc09fdcfb 100644 --- a/adb/sysdeps_win32.cpp +++ b/adb/sysdeps_win32.cpp @@ -191,7 +191,7 @@ typedef struct FHRec_ #define fh_socket u.socket #define WIN32_FH_BASE 2048 -#define WIN32_MAX_FHS 128 +#define WIN32_MAX_FHS 2048 static adb_mutex_t _win32_lock; static FHRec _win32_fhs[ WIN32_MAX_FHS ]; From 68c63d75c9c451ae196ef7bf20cd03dbeeb371ba Mon Sep 17 00:00:00 2001 From: Josh Gao Date: Mon, 18 Apr 2016 13:28:26 -0700 Subject: [PATCH 2/2] adb: disable tests that are expected to fail on Win32. Bug: http://b/28247676 Change-Id: Iaf0efc0c12835c0915a752a365651eb9bc78b3b8 --- adb/adb_io_test.cpp | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/adb/adb_io_test.cpp b/adb/adb_io_test.cpp index 21a82e823..611b23937 100644 --- a/adb/adb_io_test.cpp +++ b/adb/adb_io_test.cpp @@ -37,7 +37,13 @@ // fds far from the range that open() returns. But all of that might defeat the // purpose of the tests. -TEST(io, ReadFdExactly_whole) { +#if defined(_WIN32) +#define POSIX_TEST(x,y) TEST(DISABLED_ ## x,y) +#else +#define POSIX_TEST TEST +#endif + +POSIX_TEST(io, ReadFdExactly_whole) { const char expected[] = "Foobar"; TemporaryFile tf; ASSERT_NE(-1, tf.fd); @@ -51,7 +57,7 @@ TEST(io, ReadFdExactly_whole) { EXPECT_STREQ(expected, buf); } -TEST(io, ReadFdExactly_eof) { +POSIX_TEST(io, ReadFdExactly_eof) { const char expected[] = "Foobar"; TemporaryFile tf; ASSERT_NE(-1, tf.fd); @@ -65,7 +71,7 @@ TEST(io, ReadFdExactly_eof) { EXPECT_EQ(0, errno) << strerror(errno); } -TEST(io, ReadFdExactly_partial) { +POSIX_TEST(io, ReadFdExactly_partial) { const char input[] = "Foobar"; TemporaryFile tf; ASSERT_NE(-1, tf.fd); @@ -82,7 +88,7 @@ TEST(io, ReadFdExactly_partial) { EXPECT_STREQ(expected.c_str(), buf); } -TEST(io, WriteFdExactly_whole) { +POSIX_TEST(io, WriteFdExactly_whole) { const char expected[] = "Foobar"; TemporaryFile tf; ASSERT_NE(-1, tf.fd); @@ -97,7 +103,7 @@ TEST(io, WriteFdExactly_whole) { EXPECT_STREQ(expected, s.c_str()); } -TEST(io, WriteFdExactly_partial) { +POSIX_TEST(io, WriteFdExactly_partial) { const char buf[] = "Foobar"; TemporaryFile tf; ASSERT_NE(-1, tf.fd); @@ -114,7 +120,7 @@ TEST(io, WriteFdExactly_partial) { EXPECT_EQ(expected, s); } -TEST(io, WriteFdExactly_ENOSPC) { +POSIX_TEST(io, WriteFdExactly_ENOSPC) { int fd = open("/dev/full", O_WRONLY); ASSERT_NE(-1, fd); @@ -123,7 +129,7 @@ TEST(io, WriteFdExactly_ENOSPC) { ASSERT_EQ(ENOSPC, errno); } -TEST(io, WriteFdExactly_string) { +POSIX_TEST(io, WriteFdExactly_string) { const char str[] = "Foobar"; TemporaryFile tf; ASSERT_NE(-1, tf.fd); @@ -137,7 +143,7 @@ TEST(io, WriteFdExactly_string) { EXPECT_STREQ(str, s.c_str()); } -TEST(io, WriteFdFmt) { +POSIX_TEST(io, WriteFdFmt) { TemporaryFile tf; ASSERT_NE(-1, tf.fd);