diff options
author | Josh Gao <jmgao@google.com> | 2016-12-12 18:15:33 -0800 |
---|---|---|
committer | Josh Gao <jmgao@google.com> | 2016-12-12 18:20:57 -0800 |
commit | 8c483bdcb493776534f3d97424426c70b81f67f6 (patch) | |
tree | 4318286929fa68b80543af8936848b2940389656 /client/main.cpp | |
parent | 2922cbd3b4a71dabc4717aee48a6e36119d824ee (diff) | |
download | adb-8c483bdcb493776534f3d97424426c70b81f67f6.tar.gz |
adb: retry install_listener for a while.
install_listener can fail if we told a previous adb server to quit and
it hasn't finished doing so yet. Retry it for a few hundred
milliseconds to avoid this.
Bug: http://b/28618716
Test: nc -l 5037; adb server nodaemon
Change-Id: Ibbda8f2718b85a2b6a08985aa8d29aa2204a3ead
Diffstat (limited to 'client/main.cpp')
-rw-r--r-- | client/main.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/client/main.cpp b/client/main.cpp index 4ec0fc2..d583516 100644 --- a/client/main.cpp +++ b/client/main.cpp @@ -23,6 +23,8 @@ #include <stdlib.h> #include <unistd.h> +#include <thread> + #include <android-base/errors.h> #include <android-base/file.h> #include <android-base/logging.h> @@ -33,6 +35,7 @@ #include "adb_listeners.h" #include "adb_utils.h" #include "commandline.h" +#include "sysdeps/chrono.h" #include "transport.h" static std::string GetLogFilePath() { @@ -113,8 +116,18 @@ int adb_server_main(int is_daemon, const std::string& socket_spec, int ack_reply local_init(DEFAULT_ADB_LOCAL_TRANSPORT_PORT); std::string error; - if (install_listener(socket_spec, "*smartsocket*", nullptr, 0, nullptr, &error)) { - fatal("could not install *smartsocket* listener: %s", error.c_str()); + + auto start = std::chrono::steady_clock::now(); + + // If we told a previous adb server to quit because of version mismatch, we can get to this + // point before it's finished exiting. Retry for a while to give it some time. + while (install_listener(socket_spec, "*smartsocket*", nullptr, 0, nullptr, &error) != + INSTALL_STATUS_OK) { + if (std::chrono::steady_clock::now() - start > 0.5s) { + fatal("could not install *smartsocket* listener: %s", error.c_str()); + } + + std::this_thread::sleep_for(100ms); } if (is_daemon) { |