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 16cc69bee3e15d73f66ca6b7fdb39749a09df988..77d24c9684b744dd20ff68bdfc634bff4c46fc79 100644 |
--- a/chrome/browser/devtools/adb/android_usb_socket.cc |
+++ b/chrome/browser/devtools/adb/android_usb_socket.cc |
@@ -33,18 +33,21 @@ AndroidUsbSocket::AndroidUsbSocket(scoped_refptr<AndroidUsbDevice> device, |
delete_callback_(delete_callback), |
local_id_(socket_id), |
remote_id_(0), |
- is_connected_(false), |
- is_closed_(false) { |
+ is_connected_(false) { |
} |
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 +82,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: |
@@ -91,7 +92,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(); |
@@ -106,7 +113,7 @@ int AndroidUsbSocket::Read(net::IOBuffer* buffer, |
int length, |
const net::CompletionCallback& callback) { |
if (!is_connected_) |
- return is_closed_ ? 0 : net::ERR_SOCKET_NOT_CONNECTED; |
+ return device_ ? net::ERR_SOCKET_NOT_CONNECTED : 0; |
if (read_buffer_.empty()) { |
read_requests_.push_back(IORequest(buffer, length, callback)); |
@@ -149,7 +156,7 @@ int 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 +164,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 { |