From 1197952e71cffe5fab91625e49670083ead78712 Mon Sep 17 00:00:00 2001 From: Lingfeng Yang Date: Thu, 6 Oct 2016 12:22:55 -0700 Subject: [PATCH] Fix adb flakiness on reboot bug: 31950237 There are two lists of active ADB transports (devices), and with the emulator, they can go out of sync. This CL more conservatively checks if there are no transports in either list before commiting to register a new transport for the emulator. (cherry picked from commit edaedfd5da41b2f5aa14b4d52742a6d8caa49214) Change-Id: Id1201dc59c70825881dad80925c2e5bcc13dbd5e --- adb/adb.h | 2 ++ adb/transport_local.cpp | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/adb/adb.h b/adb/adb.h index 2797f6b54..df59aaaa9 100644 --- a/adb/adb.h +++ b/adb/adb.h @@ -139,8 +139,10 @@ int get_available_local_transport_index(); int init_socket_transport(atransport *t, int s, int port, int local); void init_usb_transport(atransport *t, usb_handle *usb, ConnectionState state); +std::string getEmulatorSerialString(int console_port); #if ADB_HOST atransport* find_emulator_transport_by_adb_port(int adb_port); +atransport* find_emulator_transport_by_console_port(int console_port); #endif int service_to_fd(const char* name, const atransport* transport); diff --git a/adb/transport_local.cpp b/adb/transport_local.cpp index a94b41efa..ea2bf7747 100644 --- a/adb/transport_local.cpp +++ b/adb/transport_local.cpp @@ -103,7 +103,8 @@ int local_connect_arbitrary_ports(int console_port, int adb_port, std::string* e int fd = -1; #if ADB_HOST - if (find_emulator_transport_by_adb_port(adb_port) != nullptr) { + if (find_emulator_transport_by_adb_port(adb_port) != nullptr || + find_emulator_transport_by_console_port(console_port) != nullptr) { return -1; } @@ -120,7 +121,7 @@ int local_connect_arbitrary_ports(int console_port, int adb_port, std::string* e D("client: connected on remote on fd %d", fd); close_on_exec(fd); disable_tcp_nagle(fd); - std::string serial = android::base::StringPrintf("emulator-%d", console_port); + std::string serial = getEmulatorSerialString(console_port); if (register_socket_transport(fd, serial.c_str(), adb_port, 1) == 0) { return 0; } @@ -431,6 +432,11 @@ static atransport* find_emulator_transport_by_adb_port_locked(int adb_port) return NULL; } +std::string getEmulatorSerialString(int console_port) +{ + return android::base::StringPrintf("emulator-%d", console_port); +} + atransport* find_emulator_transport_by_adb_port(int adb_port) { std::lock_guard lock(local_transports_lock); @@ -438,6 +444,12 @@ atransport* find_emulator_transport_by_adb_port(int adb_port) return result; } +atransport* find_emulator_transport_by_console_port(int console_port) +{ + return find_transport(getEmulatorSerialString(console_port).c_str()); +} + + /* Only call this function if you already hold local_transports_lock. */ int get_available_local_transport_index_locked() {