Index: chrome/browser/devtools/adb/android_usb_socket.cc |
diff --git a/chrome/browser/devtools/adb/android_usb_socket.cc b/chrome/browser/devtools/adb/android_usb_socket.cc |
index ee9c9df5674dda237ce4fc83fc653d7859715c20..29b434c72c281af5cdc63500b8eb532fba66f680 100644 |
--- a/chrome/browser/devtools/adb/android_usb_socket.cc |
+++ b/chrome/browser/devtools/adb/android_usb_socket.cc |
@@ -41,10 +41,14 @@ AndroidUsbSocket::~AndroidUsbSocket() { |
DCHECK(CalledOnValidThread()); |
if (is_connected_) |
Disconnect(); |
- delete_callback_.Run(local_id_); |
+ if (!delete_callback_.is_null()) |
+ delete_callback_.Run(local_id_); |
} |
void AndroidUsbSocket::HandleIncoming(scoped_refptr<AdbMessage> message) { |
+ if (!device_) |
+ return; |
+ |
CHECK_EQ(message->arg1, local_id_); |
switch (message->command) { |
case AdbMessage::kCommandOKAY: |
@@ -79,9 +83,7 @@ void AndroidUsbSocket::HandleIncoming(scoped_refptr<AdbMessage> message) { |
case AdbMessage::kCommandCLSE: |
if (is_connected_) |
device_->Send(AdbMessage::kCommandCLSE, local_id_, 0, ""); |
- is_connected_ = false; |
- is_closed_ = true; |
- RespondToReaders(true); |
+ Terminated(); |
// "this" can be NULL. |
break; |
default: |
@@ -92,6 +94,13 @@ void AndroidUsbSocket::HandleIncoming(scoped_refptr<AdbMessage> message) { |
void AndroidUsbSocket::Terminated() { |
is_connected_ = false; |
is_closed_ = true; |
+ |
+ // Break the socket -> device connection, release the device. |
+ delete_callback_.Run(local_id_); |
+ delete_callback_.Reset(); |
+ device_ = NULL; |
+ |
+ // Respond to pending callbacks. |
if (!connect_callback_.is_null()) { |
net::CompletionCallback callback = connect_callback_; |
connect_callback_.Reset(); |
@@ -149,7 +158,7 @@ bool AndroidUsbSocket::SetSendBufferSize(int32 size) { |
int AndroidUsbSocket::Connect(const net::CompletionCallback& callback) { |
DCHECK(CalledOnValidThread()); |
- if (device_->terminated()) |
+ if (!device_) |
return net::ERR_FAILED; |
connect_callback_ = callback; |
device_->Send(AdbMessage::kCommandOPEN, local_id_, 0, command_); |
@@ -157,9 +166,10 @@ int AndroidUsbSocket::Connect(const net::CompletionCallback& callback) { |
} |
void AndroidUsbSocket::Disconnect() { |
- is_connected_ = false; |
+ if (!device_) |
+ return; |
device_->Send(AdbMessage::kCommandCLSE, local_id_, remote_id_, ""); |
- RespondToReaders(true); |
+ Terminated(); |
} |
bool AndroidUsbSocket::IsConnected() const { |