Merge "adb: fix deadlock between transport_unref and usb_close." am: 6f61a6d9c4

am: 2a8ce10cd8

Change-Id: I3cce2167e58402732be09a3eb567cf0de3536f09
This commit is contained in:
Josh Gao 2017-06-12 23:12:41 +00:00 committed by android-build-merger
commit 64523c01bd
2 changed files with 7 additions and 7 deletions

View file

@ -603,15 +603,15 @@ static void remove_transport(atransport* transport) {
static void transport_unref(atransport* t) {
CHECK(t != nullptr);
std::lock_guard<std::mutex> lock(transport_lock);
CHECK_GT(t->ref_count, 0u);
t->ref_count--;
if (t->ref_count == 0) {
size_t old_refcount = t->ref_count--;
CHECK_GT(old_refcount, 0u);
if (old_refcount == 1u) {
D("transport: %s unref (kicking and closing)", t->serial);
t->close(t);
remove_transport(t);
} else {
D("transport: %s unref (count=%zu)", t->serial, t->ref_count);
D("transport: %s unref (count=%zu)", t->serial, old_refcount - 1);
}
}

View file

@ -61,7 +61,7 @@ public:
// class in one go is a very large change. Given how bad our testing is,
// it's better to do this piece by piece.
atransport(ConnectionState state = kCsOffline) : connection_state_(state) {
atransport(ConnectionState state = kCsOffline) : ref_count(0), connection_state_(state) {
transport_fde = {};
protocol_version = A_VERSION;
max_payload = MAX_PAYLOAD;
@ -88,7 +88,7 @@ public:
int fd = -1;
int transport_socket = -1;
fdevent transport_fde;
size_t ref_count = 0;
std::atomic<size_t> ref_count;
uint32_t sync_token = 0;
bool online = false;
TransportType type = kTransportAny;