Merge "adbd: wait for FUNCTIONFS_BIND for up to a second, then retry." am: bfcb981b32
am: 80268fd592
Change-Id: I07a15442445e76d59cd1b6dff23ff5019eac0d45
This commit is contained in:
commit
51ca488977
1 changed files with 19 additions and 6 deletions
|
|
@ -168,7 +168,8 @@ struct ScopedAioContext {
|
||||||
struct UsbFfsConnection : public Connection {
|
struct UsbFfsConnection : public Connection {
|
||||||
UsbFfsConnection(unique_fd control, unique_fd read, unique_fd write,
|
UsbFfsConnection(unique_fd control, unique_fd read, unique_fd write,
|
||||||
std::promise<void> destruction_notifier)
|
std::promise<void> destruction_notifier)
|
||||||
: stopped_(false),
|
: worker_started_(false),
|
||||||
|
stopped_(false),
|
||||||
destruction_notifier_(std::move(destruction_notifier)),
|
destruction_notifier_(std::move(destruction_notifier)),
|
||||||
control_fd_(std::move(control)),
|
control_fd_(std::move(control)),
|
||||||
read_fd_(std::move(read)),
|
read_fd_(std::move(read)),
|
||||||
|
|
@ -194,6 +195,7 @@ struct UsbFfsConnection : public Connection {
|
||||||
|
|
||||||
// We need to explicitly close our file descriptors before we notify our destruction,
|
// We need to explicitly close our file descriptors before we notify our destruction,
|
||||||
// because the thread listening on the future will immediately try to reopen the endpoint.
|
// because the thread listening on the future will immediately try to reopen the endpoint.
|
||||||
|
aio_context_.reset();
|
||||||
control_fd_.reset();
|
control_fd_.reset();
|
||||||
read_fd_.reset();
|
read_fd_.reset();
|
||||||
write_fd_.reset();
|
write_fd_.reset();
|
||||||
|
|
@ -274,11 +276,16 @@ struct UsbFfsConnection : public Connection {
|
||||||
{ .fd = control_fd_.get(), .events = POLLIN, .revents = 0 },
|
{ .fd = control_fd_.get(), .events = POLLIN, .revents = 0 },
|
||||||
{ .fd = monitor_event_fd_.get(), .events = POLLIN, .revents = 0 },
|
{ .fd = monitor_event_fd_.get(), .events = POLLIN, .revents = 0 },
|
||||||
};
|
};
|
||||||
int rc = TEMP_FAILURE_RETRY(adb_poll(pfd, 2, -1));
|
|
||||||
|
// If we don't see our first bind within a second, try again.
|
||||||
|
int timeout_ms = bound ? -1 : 1000;
|
||||||
|
|
||||||
|
int rc = TEMP_FAILURE_RETRY(adb_poll(pfd, 2, timeout_ms));
|
||||||
if (rc == -1) {
|
if (rc == -1) {
|
||||||
PLOG(FATAL) << "poll on USB control fd failed";
|
PLOG(FATAL) << "poll on USB control fd failed";
|
||||||
} else if (rc == 0) {
|
} else if (rc == 0) {
|
||||||
LOG(FATAL) << "poll on USB control fd returned 0";
|
LOG(WARNING) << "timed out while waiting for FUNCTIONFS_BIND, trying again";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pfd[1].revents) {
|
if (pfd[1].revents) {
|
||||||
|
|
@ -330,13 +337,13 @@ struct UsbFfsConnection : public Connection {
|
||||||
}
|
}
|
||||||
|
|
||||||
StopWorker();
|
StopWorker();
|
||||||
aio_context_.reset();
|
HandleError("monitor thread finished");
|
||||||
read_fd_.reset();
|
|
||||||
write_fd_.reset();
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void StartWorker() {
|
void StartWorker() {
|
||||||
|
CHECK(!worker_started_);
|
||||||
|
worker_started_ = true;
|
||||||
worker_thread_ = std::thread([this]() {
|
worker_thread_ = std::thread([this]() {
|
||||||
adb_thread_setname("UsbFfs-worker");
|
adb_thread_setname("UsbFfs-worker");
|
||||||
for (size_t i = 0; i < kUsbReadQueueDepth; ++i) {
|
for (size_t i = 0; i < kUsbReadQueueDepth; ++i) {
|
||||||
|
|
@ -361,6 +368,10 @@ struct UsbFfsConnection : public Connection {
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopWorker() {
|
void StopWorker() {
|
||||||
|
if (!worker_started_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
pthread_t worker_thread_handle = worker_thread_.native_handle();
|
pthread_t worker_thread_handle = worker_thread_.native_handle();
|
||||||
while (true) {
|
while (true) {
|
||||||
int rc = pthread_kill(worker_thread_handle, kInterruptionSignal);
|
int rc = pthread_kill(worker_thread_handle, kInterruptionSignal);
|
||||||
|
|
@ -590,6 +601,8 @@ struct UsbFfsConnection : public Connection {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::thread monitor_thread_;
|
std::thread monitor_thread_;
|
||||||
|
|
||||||
|
bool worker_started_;
|
||||||
std::thread worker_thread_;
|
std::thread worker_thread_;
|
||||||
|
|
||||||
std::atomic<bool> stopped_;
|
std::atomic<bool> stopped_;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue