Commit 5e3d07bf authored by vkuzkokov's avatar vkuzkokov Committed by Commit bot

Revert of DevTools: Removed refcounting from AndroidWebSocket (patchset #12 of...

Revert of DevTools: Removed refcounting from AndroidWebSocket (patchset #12 of https://codereview.chromium.org/449883002/)

Reason for revert:
There is a crash when port forwarding is turned off while there is at least one connected device.

BUG=407137

Original issue's description:
> DevTools: Removed refcounting from AndroidWebSocket
>
> Issue 387067 can be resolved by having port forwarding socket dependent on all other references to AndroidDeviceManager::Device.
>
> This requires for lifetime of AWS to be manageable in the first place.
>
> BUG=387067
>
> Committed: https://src.chromium.org/viewvc/chrome?view=rev&revision=289306

Review URL: https://codereview.chromium.org/505783002

Cr-Commit-Position: refs/heads/master@{#291690}
parent 31d566a6
...@@ -20,6 +20,9 @@ const char kOkayResponse[] = "OKAY"; ...@@ -20,6 +20,9 @@ const char kOkayResponse[] = "OKAY";
const char kHostTransportCommand[] = "host:transport:%s"; const char kHostTransportCommand[] = "host:transport:%s";
const char kLocalhost[] = "127.0.0.1"; const char kLocalhost[] = "127.0.0.1";
typedef base::Callback<void(int, const std::string&)> CommandCallback;
typedef base::Callback<void(int, net::StreamSocket*)> SocketCallback;
std::string EncodeMessage(const std::string& message) { std::string EncodeMessage(const std::string& message) {
static const char kHexChars[] = "0123456789ABCDEF"; static const char kHexChars[] = "0123456789ABCDEF";
...@@ -70,14 +73,14 @@ class AdbTransportSocket : public AdbClientSocket { ...@@ -70,14 +73,14 @@ class AdbTransportSocket : public AdbClientSocket {
void OnSocketAvailable(int result, const std::string& response) { void OnSocketAvailable(int result, const std::string& response) {
if (!CheckNetResultOrDie(result)) if (!CheckNetResultOrDie(result))
return; return;
callback_.Run(net::OK, socket_.Pass()); callback_.Run(net::OK, socket_.release());
delete this; delete this;
} }
bool CheckNetResultOrDie(int result) { bool CheckNetResultOrDie(int result) {
if (result >= 0) if (result >= 0)
return true; return true;
callback_.Run(result, make_scoped_ptr<net::StreamSocket>(NULL)); callback_.Run(result, NULL);
delete this; delete this;
return false; return false;
} }
......
...@@ -13,7 +13,7 @@ class AdbClientSocket { ...@@ -13,7 +13,7 @@ class AdbClientSocket {
public: public:
typedef base::Callback<void(int, const std::string&)> CommandCallback; typedef base::Callback<void(int, const std::string&)> CommandCallback;
typedef base::Callback<void(int result, typedef base::Callback<void(int result,
scoped_ptr<net::StreamSocket>)> SocketCallback; net::StreamSocket*)> SocketCallback;
static void AdbQuery(int port, static void AdbQuery(int port,
const std::string& query, const std::string& query,
......
...@@ -50,9 +50,9 @@ static void PostSocketCallback( ...@@ -50,9 +50,9 @@ static void PostSocketCallback(
scoped_refptr<base::MessageLoopProxy> response_message_loop, scoped_refptr<base::MessageLoopProxy> response_message_loop,
const AndroidDeviceManager::SocketCallback& callback, const AndroidDeviceManager::SocketCallback& callback,
int result, int result,
scoped_ptr<net::StreamSocket> socket) { net::StreamSocket* socket) {
response_message_loop->PostTask( response_message_loop->PostTask(FROM_HERE,
FROM_HERE, base::Bind(callback, result, base::Passed(&socket))); base::Bind(callback, result, socket));
} }
class HttpRequest { class HttpRequest {
...@@ -61,41 +61,39 @@ class HttpRequest { ...@@ -61,41 +61,39 @@ class HttpRequest {
typedef AndroidDeviceManager::SocketCallback SocketCallback; typedef AndroidDeviceManager::SocketCallback SocketCallback;
static void CommandRequest(const std::string& request, static void CommandRequest(const std::string& request,
const CommandCallback& callback, const CommandCallback& callback,
int result, int result,
scoped_ptr<net::StreamSocket> socket) { net::StreamSocket* socket) {
if (result != net::OK) { if (result != net::OK) {
callback.Run(result, std::string()); callback.Run(result, std::string());
return; return;
} }
new HttpRequest(socket.Pass(), request, callback); new HttpRequest(socket, request, callback);
} }
static void SocketRequest(const std::string& request, static void SocketRequest(const std::string& request,
const SocketCallback& callback, const SocketCallback& callback,
int result, int result,
scoped_ptr<net::StreamSocket> socket) { net::StreamSocket* socket) {
if (result != net::OK) { if (result != net::OK) {
callback.Run(result, make_scoped_ptr<net::StreamSocket>(NULL)); callback.Run(result, NULL);
return; return;
} }
new HttpRequest(socket.Pass(), request, callback); new HttpRequest(socket, request, callback);
} }
private: private:
HttpRequest(scoped_ptr<net::StreamSocket> socket, HttpRequest(net::StreamSocket* socket,
const std::string& request, const std::string& request,
const CommandCallback& callback) const CommandCallback& callback)
: socket_(socket.Pass()), : socket_(socket), command_callback_(callback), body_pos_(0) {
command_callback_(callback),
body_pos_(0) {
SendRequest(request); SendRequest(request);
} }
HttpRequest(scoped_ptr<net::StreamSocket> socket, HttpRequest(net::StreamSocket* socket,
const std::string& request, const std::string& request,
const SocketCallback& callback) const SocketCallback& callback)
: socket_(socket.Pass()), : socket_(socket),
socket_callback_(callback), socket_callback_(callback),
body_pos_(0) { body_pos_(0) {
SendRequest(request); SendRequest(request);
...@@ -171,7 +169,7 @@ class HttpRequest { ...@@ -171,7 +169,7 @@ class HttpRequest {
if (!command_callback_.is_null()) if (!command_callback_.is_null())
command_callback_.Run(net::OK, response_.substr(body_pos_)); command_callback_.Run(net::OK, response_.substr(body_pos_));
else else
socket_callback_.Run(net::OK, socket_.Pass()); socket_callback_.Run(net::OK, socket_.release());
delete this; delete this;
return; return;
} }
...@@ -193,7 +191,7 @@ class HttpRequest { ...@@ -193,7 +191,7 @@ class HttpRequest {
if (!command_callback_.is_null()) if (!command_callback_.is_null())
command_callback_.Run(result, std::string()); command_callback_.Run(result, std::string());
else else
socket_callback_.Run(result, make_scoped_ptr<net::StreamSocket>(NULL)); socket_callback_.Run(result, NULL);
delete this; delete this;
return false; return false;
} }
......
...@@ -24,8 +24,7 @@ class AndroidDeviceManager ...@@ -24,8 +24,7 @@ class AndroidDeviceManager
public base::NonThreadSafe { public base::NonThreadSafe {
public: public:
typedef base::Callback<void(int, const std::string&)> CommandCallback; typedef base::Callback<void(int, const std::string&)> CommandCallback;
typedef base::Callback<void(int result, scoped_ptr<net::StreamSocket>)> typedef base::Callback<void(int result, net::StreamSocket*)> SocketCallback;
SocketCallback;
typedef base::Callback<void(const std::vector<std::string>&)> SerialsCallback; typedef base::Callback<void(const std::vector<std::string>&)> SerialsCallback;
struct BrowserInfo { struct BrowserInfo {
...@@ -54,21 +53,32 @@ class AndroidDeviceManager ...@@ -54,21 +53,32 @@ class AndroidDeviceManager
typedef base::Callback<void(const DeviceInfo&)> DeviceInfoCallback; typedef base::Callback<void(const DeviceInfo&)> DeviceInfoCallback;
class AndroidWebSocket { class AndroidWebSocket : public base::RefCountedThreadSafe<AndroidWebSocket> {
public: public:
class Delegate { class Delegate {
public: public:
virtual void OnSocketOpened() = 0; virtual void OnSocketOpened() = 0;
virtual void OnFrameRead(const std::string& message) = 0; virtual void OnFrameRead(const std::string& message) = 0;
virtual void OnSocketClosed() = 0; virtual void OnSocketClosed(bool closed_by_device) = 0;
protected: protected:
virtual ~Delegate() {} virtual ~Delegate() {}
}; };
virtual ~AndroidWebSocket() {} AndroidWebSocket() {}
virtual void Connect() = 0;
virtual void Disconnect() = 0;
virtual void SendFrame(const std::string& message) = 0; virtual void SendFrame(const std::string& message) = 0;
virtual void ClearDelegate() = 0;
protected:
virtual ~AndroidWebSocket() {}
private:
friend class base::RefCountedThreadSafe<AndroidWebSocket>;
DISALLOW_COPY_AND_ASSIGN(AndroidWebSocket);
}; };
class DeviceProvider; class DeviceProvider;
...@@ -93,7 +103,7 @@ class AndroidDeviceManager ...@@ -93,7 +103,7 @@ class AndroidDeviceManager
const std::string& url, const std::string& url,
const SocketCallback& callback); const SocketCallback& callback);
AndroidWebSocket* CreateWebSocket( scoped_refptr<AndroidWebSocket> CreateWebSocket(
const std::string& socket_name, const std::string& socket_name,
const std::string& url, const std::string& url,
AndroidWebSocket::Delegate* delegate); AndroidWebSocket::Delegate* delegate);
......
...@@ -186,12 +186,11 @@ class ProtocolCommand ...@@ -186,12 +186,11 @@ class ProtocolCommand
private: private:
virtual void OnSocketOpened() OVERRIDE; virtual void OnSocketOpened() OVERRIDE;
virtual void OnFrameRead(const std::string& message) OVERRIDE; virtual void OnFrameRead(const std::string& message) OVERRIDE;
virtual void OnSocketClosed() OVERRIDE; virtual void OnSocketClosed(bool closed_by_device) OVERRIDE;
virtual ~ProtocolCommand();
const std::string command_; const std::string command_;
const base::Closure callback_; const base::Closure callback_;
scoped_ptr<DevToolsAndroidBridge::AndroidWebSocket> web_socket_; scoped_refptr<DevToolsAndroidBridge::AndroidWebSocket> web_socket_;
DISALLOW_COPY_AND_ASSIGN(ProtocolCommand); DISALLOW_COPY_AND_ASSIGN(ProtocolCommand);
}; };
...@@ -202,8 +201,9 @@ ProtocolCommand::ProtocolCommand( ...@@ -202,8 +201,9 @@ ProtocolCommand::ProtocolCommand(
const std::string& command, const std::string& command,
const base::Closure callback) const base::Closure callback)
: command_(command), : command_(command),
callback_(callback), callback_(callback){
web_socket_(browser->CreateWebSocket(debug_url, this)) { web_socket_ = browser->CreateWebSocket(debug_url, this);
web_socket_->Connect();
} }
void ProtocolCommand::OnSocketOpened() { void ProtocolCommand::OnSocketOpened() {
...@@ -211,16 +211,14 @@ void ProtocolCommand::OnSocketOpened() { ...@@ -211,16 +211,14 @@ void ProtocolCommand::OnSocketOpened() {
} }
void ProtocolCommand::OnFrameRead(const std::string& message) { void ProtocolCommand::OnFrameRead(const std::string& message) {
delete this; web_socket_->Disconnect();
}
void ProtocolCommand::OnSocketClosed() {
delete this;
} }
ProtocolCommand::~ProtocolCommand() { void ProtocolCommand::OnSocketClosed(bool closed_by_device) {
if (!callback_.is_null()) if (!callback_.is_null()) {
callback_.Run(); callback_.Run();
}
delete this;
} }
} // namespace } // namespace
...@@ -293,15 +291,14 @@ class AgentHostDelegate ...@@ -293,15 +291,14 @@ class AgentHostDelegate
const std::string& message) OVERRIDE; const std::string& message) OVERRIDE;
virtual void OnSocketOpened() OVERRIDE; virtual void OnSocketOpened() OVERRIDE;
virtual void OnFrameRead(const std::string& message) OVERRIDE; virtual void OnFrameRead(const std::string& message) OVERRIDE;
virtual void OnSocketClosed() OVERRIDE; virtual void OnSocketClosed(bool closed_by_device) OVERRIDE;
const std::string id_; const std::string id_;
scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser_;
const std::string debug_url_;
bool socket_opened_; bool socket_opened_;
bool detached_;
bool is_web_view_; bool is_web_view_;
std::vector<std::string> pending_messages_; std::vector<std::string> pending_messages_;
scoped_ptr<DevToolsAndroidBridge::AndroidWebSocket> web_socket_; scoped_refptr<DevToolsAndroidBridge::AndroidWebSocket> web_socket_;
content::DevToolsAgentHost* agent_host_; content::DevToolsAgentHost* agent_host_;
content::DevToolsExternalAgentProxy* proxy_; content::DevToolsExternalAgentProxy* proxy_;
DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate); DISALLOW_COPY_AND_ASSIGN(AgentHostDelegate);
...@@ -330,10 +327,10 @@ AgentHostDelegate::AgentHostDelegate( ...@@ -330,10 +327,10 @@ AgentHostDelegate::AgentHostDelegate(
scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
const std::string& debug_url) const std::string& debug_url)
: id_(id), : id_(id),
browser_(browser),
debug_url_(debug_url),
socket_opened_(false), socket_opened_(false),
detached_(false),
is_web_view_(browser->IsWebView()), is_web_view_(browser->IsWebView()),
web_socket_(browser->CreateWebSocket(debug_url, this)),
agent_host_(NULL), agent_host_(NULL),
proxy_(NULL) { proxy_(NULL) {
g_host_delegates.Get()[id] = this; g_host_delegates.Get()[id] = this;
...@@ -341,17 +338,20 @@ AgentHostDelegate::AgentHostDelegate( ...@@ -341,17 +338,20 @@ AgentHostDelegate::AgentHostDelegate(
AgentHostDelegate::~AgentHostDelegate() { AgentHostDelegate::~AgentHostDelegate() {
g_host_delegates.Get().erase(id_); g_host_delegates.Get().erase(id_);
web_socket_->ClearDelegate();
} }
void AgentHostDelegate::Attach(content::DevToolsExternalAgentProxy* proxy) { void AgentHostDelegate::Attach(content::DevToolsExternalAgentProxy* proxy) {
proxy_ = proxy; proxy_ = proxy;
content::RecordAction(base::UserMetricsAction(is_web_view_ ? content::RecordAction(base::UserMetricsAction(is_web_view_ ?
"DevTools_InspectAndroidWebView" : "DevTools_InspectAndroidPage")); "DevTools_InspectAndroidWebView" : "DevTools_InspectAndroidPage"));
web_socket_.reset(browser_->CreateWebSocket(debug_url_, this)); web_socket_->Connect();
} }
void AgentHostDelegate::Detach() { void AgentHostDelegate::Detach() {
web_socket_.reset(); detached_ = true;
if (socket_opened_)
web_socket_->Disconnect();
} }
void AgentHostDelegate::SendMessageToBackend(const std::string& message) { void AgentHostDelegate::SendMessageToBackend(const std::string& message) {
...@@ -362,6 +362,11 @@ void AgentHostDelegate::SendMessageToBackend(const std::string& message) { ...@@ -362,6 +362,11 @@ void AgentHostDelegate::SendMessageToBackend(const std::string& message) {
} }
void AgentHostDelegate::OnSocketOpened() { void AgentHostDelegate::OnSocketOpened() {
if (detached_) {
web_socket_->Disconnect();
return;
}
socket_opened_ = true; socket_opened_ = true;
for (std::vector<std::string>::iterator it = pending_messages_.begin(); for (std::vector<std::string>::iterator it = pending_messages_.begin();
it != pending_messages_.end(); ++it) { it != pending_messages_.end(); ++it) {
...@@ -375,8 +380,8 @@ void AgentHostDelegate::OnFrameRead(const std::string& message) { ...@@ -375,8 +380,8 @@ void AgentHostDelegate::OnFrameRead(const std::string& message) {
proxy_->DispatchOnClientHost(message); proxy_->DispatchOnClientHost(message);
} }
void AgentHostDelegate::OnSocketClosed() { void AgentHostDelegate::OnSocketClosed(bool closed_by_device) {
if (proxy_) if (proxy_ && closed_by_device)
proxy_->ConnectionClosed(); proxy_->ConnectionClosed();
} }
...@@ -609,7 +614,7 @@ DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() { ...@@ -609,7 +614,7 @@ DevToolsAndroidBridge::RemoteBrowser::GetAgentHost() {
"adb:" + device_->serial() + ":" + socket_, this, kBrowserTargetSocket); "adb:" + device_->serial() + ":" + socket_, this, kBrowserTargetSocket);
} }
DevToolsAndroidBridge::AndroidWebSocket* scoped_refptr<DevToolsAndroidBridge::AndroidWebSocket>
DevToolsAndroidBridge::RemoteBrowser::CreateWebSocket( DevToolsAndroidBridge::RemoteBrowser::CreateWebSocket(
const std::string& url, const std::string& url,
DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate) { DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate) {
......
...@@ -121,7 +121,7 @@ class DevToolsAndroidBridge ...@@ -121,7 +121,7 @@ class DevToolsAndroidBridge
scoped_refptr<content::DevToolsAgentHost> GetAgentHost(); scoped_refptr<content::DevToolsAgentHost> GetAgentHost();
AndroidWebSocket* CreateWebSocket( scoped_refptr<AndroidWebSocket> CreateWebSocket(
const std::string& url, const std::string& url,
DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate); DevToolsAndroidBridge::AndroidWebSocket::Delegate* delegate);
......
...@@ -59,11 +59,11 @@ class SocketTunnel : public base::NonThreadSafe { ...@@ -59,11 +59,11 @@ class SocketTunnel : public base::NonThreadSafe {
int port, int port,
const CounterCallback& callback, const CounterCallback& callback,
int result, int result,
scoped_ptr<net::StreamSocket> socket) { net::StreamSocket* socket) {
if (result < 0) if (result < 0)
return; return;
SocketTunnel* tunnel = new SocketTunnel(callback); SocketTunnel* tunnel = new SocketTunnel(callback);
tunnel->Start(socket.Pass(), host, port); tunnel->Start(socket, host, port);
} }
private: private:
...@@ -75,9 +75,8 @@ class SocketTunnel : public base::NonThreadSafe { ...@@ -75,9 +75,8 @@ class SocketTunnel : public base::NonThreadSafe {
callback_.Run(1); callback_.Run(1);
} }
void Start(scoped_ptr<net::StreamSocket> socket, void Start(net::StreamSocket* socket, const std::string& host, int port) {
const std::string& host, int port) { remote_socket_.reset(socket);
remote_socket_.swap(socket);
host_resolver_ = net::HostResolver::CreateDefaultResolver(NULL); host_resolver_ = net::HostResolver::CreateDefaultResolver(NULL);
net::HostResolver::RequestInfo request_info(net::HostPortPair(host, port)); net::HostResolver::RequestInfo request_info(net::HostPortPair(host, port));
...@@ -255,13 +254,15 @@ FindBestBrowserForTethering( ...@@ -255,13 +254,15 @@ FindBestBrowserForTethering(
} // namespace } // namespace
class PortForwardingController::Connection class PortForwardingController::Connection
: public DevToolsAndroidBridge::AndroidWebSocket::Delegate { : public DevToolsAndroidBridge::AndroidWebSocket::Delegate,
public base::RefCountedThreadSafe<
Connection,
content::BrowserThread::DeleteOnUIThread> {
public: public:
Connection(Registry* registry, Connection(Registry* registry,
scoped_refptr<DevToolsAndroidBridge::RemoteDevice> device, scoped_refptr<DevToolsAndroidBridge::RemoteDevice> device,
scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser, scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser,
const ForwardingMap& forwarding_map); const ForwardingMap& forwarding_map);
virtual ~Connection();
const PortStatusMap& GetPortStatusMap(); const PortStatusMap& GetPortStatusMap();
...@@ -274,6 +275,7 @@ class PortForwardingController::Connection ...@@ -274,6 +275,7 @@ class PortForwardingController::Connection
content::BrowserThread::UI>; content::BrowserThread::UI>;
friend class base::DeleteHelper<Connection>; friend class base::DeleteHelper<Connection>;
virtual ~Connection();
typedef std::map<int, std::string> ForwardingMap; typedef std::map<int, std::string> ForwardingMap;
...@@ -290,25 +292,23 @@ class PortForwardingController::Connection ...@@ -290,25 +292,23 @@ class PortForwardingController::Connection
void ProcessBindResponse(int port, PortStatus status); void ProcessBindResponse(int port, PortStatus status);
void ProcessUnbindResponse(int port, PortStatus status); void ProcessUnbindResponse(int port, PortStatus status);
static void UpdateSocketCountOnHandlerThread( void UpdateSocketCountOnHandlerThread(int port, int increment);
base::WeakPtr<Connection> weak_connection, int port, int increment);
void UpdateSocketCount(int port, int increment); void UpdateSocketCount(int port, int increment);
// DevToolsAndroidBridge::AndroidWebSocket::Delegate implementation: // DevToolsAndroidBridge::AndroidWebSocket::Delegate implementation:
virtual void OnSocketOpened() OVERRIDE; virtual void OnSocketOpened() OVERRIDE;
virtual void OnFrameRead(const std::string& message) OVERRIDE; virtual void OnFrameRead(const std::string& message) OVERRIDE;
virtual void OnSocketClosed() OVERRIDE; virtual void OnSocketClosed(bool closed_by_device) OVERRIDE;
PortForwardingController::Registry* registry_; PortForwardingController::Registry* registry_;
scoped_refptr<DevToolsAndroidBridge::RemoteDevice> device_; scoped_refptr<DevToolsAndroidBridge::RemoteDevice> device_;
scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser_; scoped_refptr<DevToolsAndroidBridge::RemoteBrowser> browser_;
scoped_ptr<DevToolsAndroidBridge::AndroidWebSocket> web_socket_; scoped_refptr<DevToolsAndroidBridge::AndroidWebSocket> web_socket_;
int command_id_; int command_id_;
bool connected_; bool connected_;
ForwardingMap forwarding_map_; ForwardingMap forwarding_map_;
CommandCallbackMap pending_responses_; CommandCallbackMap pending_responses_;
PortStatusMap port_status_; PortStatusMap port_status_;
base::WeakPtrFactory<Connection> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(Connection); DISALLOW_COPY_AND_ASSIGN(Connection);
}; };
...@@ -323,18 +323,27 @@ PortForwardingController::Connection::Connection( ...@@ -323,18 +323,27 @@ PortForwardingController::Connection::Connection(
browser_(browser), browser_(browser),
command_id_(0), command_id_(0),
connected_(false), connected_(false),
forwarding_map_(forwarding_map), forwarding_map_(forwarding_map) {
weak_factory_(this) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
(*registry_)[device_->serial()] = this; (*registry_)[device_->serial()] = this;
web_socket_.reset( web_socket_ = browser->CreateWebSocket(kDevToolsRemoteBrowserTarget, this);
browser->CreateWebSocket(kDevToolsRemoteBrowserTarget, this)); web_socket_->Connect();
AddRef(); // Balanced in OnSocketClosed();
}
void PortForwardingController::Connection::Shutdown() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
registry_ = NULL;
// This will have no effect if the socket is not connected yet.
web_socket_->Disconnect();
} }
PortForwardingController::Connection::~Connection() { PortForwardingController::Connection::~Connection() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(registry_->find(device_->serial()) != registry_->end()); if (registry_) {
registry_->erase(device_->serial()); DCHECK(registry_->find(device_->serial()) != registry_->end());
registry_->erase(device_->serial());
}
} }
void PortForwardingController::Connection::UpdateForwardingMap( void PortForwardingController::Connection::UpdateForwardingMap(
...@@ -431,12 +440,10 @@ void PortForwardingController::Connection::ProcessUnbindResponse( ...@@ -431,12 +440,10 @@ void PortForwardingController::Connection::ProcessUnbindResponse(
port_status_.erase(it); port_status_.erase(it);
} }
// static
void PortForwardingController::Connection::UpdateSocketCountOnHandlerThread( void PortForwardingController::Connection::UpdateSocketCountOnHandlerThread(
base::WeakPtr<Connection> weak_connection, int port, int increment) { int port, int increment) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::Bind(&Connection::UpdateSocketCount, base::Bind(&Connection::UpdateSocketCount, this, port, increment));
weak_connection, port, increment));
} }
void PortForwardingController::Connection::UpdateSocketCount( void PortForwardingController::Connection::UpdateSocketCount(
...@@ -460,12 +467,19 @@ PortForwardingController::Connection::GetPortStatusMap() { ...@@ -460,12 +467,19 @@ PortForwardingController::Connection::GetPortStatusMap() {
void PortForwardingController::Connection::OnSocketOpened() { void PortForwardingController::Connection::OnSocketOpened() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
if (!registry_) {
// Socket was created after Shutdown was called. Disconnect immediately.
web_socket_->Disconnect();
return;
}
connected_ = true; connected_ = true;
SerializeChanges(kTetheringBind, ForwardingMap(), forwarding_map_); SerializeChanges(kTetheringBind, ForwardingMap(), forwarding_map_);
} }
void PortForwardingController::Connection::OnSocketClosed() { void PortForwardingController::Connection::OnSocketClosed(
delete this; bool closed_by_device) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
Release(); // Balanced in the constructor.
} }
void PortForwardingController::Connection::OnFrameRead( void PortForwardingController::Connection::OnFrameRead(
...@@ -505,8 +519,7 @@ void PortForwardingController::Connection::OnFrameRead( ...@@ -505,8 +519,7 @@ void PortForwardingController::Connection::OnFrameRead(
std::string destination_host = tokens[0]; std::string destination_host = tokens[0];
SocketTunnel::CounterCallback callback = SocketTunnel::CounterCallback callback =
base::Bind(&Connection::UpdateSocketCountOnHandlerThread, base::Bind(&Connection::UpdateSocketCountOnHandlerThread, this, port);
weak_factory_.GetWeakPtr(), port);
device_->OpenSocket( device_->OpenSocket(
connection_id.c_str(), connection_id.c_str(),
...@@ -593,7 +606,7 @@ void PortForwardingController::OnPrefsChange() { ...@@ -593,7 +606,7 @@ void PortForwardingController::OnPrefsChange() {
UpdateConnections(); UpdateConnections();
} else { } else {
StopListening(); StopListening();
STLDeleteValues(&registry_); ShutdownConnections();
NotifyListeners(DevicesStatus()); NotifyListeners(DevicesStatus());
} }
} }
...@@ -624,6 +637,12 @@ void PortForwardingController::UpdateConnections() { ...@@ -624,6 +637,12 @@ void PortForwardingController::UpdateConnections() {
it->second->UpdateForwardingMap(forwarding_map_); it->second->UpdateForwardingMap(forwarding_map_);
} }
void PortForwardingController::ShutdownConnections() {
for (Registry::iterator it = registry_.begin(); it != registry_.end(); ++it)
it->second->Shutdown();
registry_.clear();
}
void PortForwardingController::NotifyListeners( void PortForwardingController::NotifyListeners(
const DevicesStatus& status) const { const DevicesStatus& status) const {
Listeners copy(listeners_); // Iterate over copy. Listeners copy(listeners_); // Iterate over copy.
......
...@@ -77,6 +77,7 @@ class PortForwardingController ...@@ -77,6 +77,7 @@ class PortForwardingController
void StopListening(); void StopListening();
void UpdateConnections(); void UpdateConnections();
void ShutdownConnections();
void NotifyListeners(const DevicesStatus& status) const; void NotifyListeners(const DevicesStatus& status) const;
......
...@@ -17,9 +17,9 @@ const char kSerial[] = "local"; ...@@ -17,9 +17,9 @@ const char kSerial[] = "local";
static void RunSocketCallback( static void RunSocketCallback(
const AndroidDeviceManager::SocketCallback& callback, const AndroidDeviceManager::SocketCallback& callback,
scoped_ptr<net::StreamSocket> socket, net::StreamSocket* socket,
int result) { int result) {
callback.Run(result, socket.Pass()); callback.Run(result, socket);
} }
} // namespace } // namespace
...@@ -61,8 +61,7 @@ void SelfAsDeviceProvider::OpenSocket(const std::string& serial, ...@@ -61,8 +61,7 @@ void SelfAsDeviceProvider::OpenSocket(const std::string& serial,
base::StringToInt(socket_name, &port); base::StringToInt(socket_name, &port);
net::AddressList address_list = net::AddressList address_list =
net::AddressList::CreateFromIPAddress(ip_number, port); net::AddressList::CreateFromIPAddress(ip_number, port);
scoped_ptr<net::StreamSocket> socket(new net::TCPClientSocket( net::TCPClientSocket* socket = new net::TCPClientSocket(
address_list, NULL, net::NetLog::Source())); address_list, NULL, net::NetLog::Source());
socket->Connect( socket->Connect(base::Bind(&RunSocketCallback, callback, socket));
base::Bind(&RunSocketCallback, callback, base::Passed(&socket)));
} }
...@@ -19,12 +19,9 @@ const char kLocalAbstractCommand[] = "localabstract:%s"; ...@@ -19,12 +19,9 @@ const char kLocalAbstractCommand[] = "localabstract:%s";
const int kBufferSize = 16 * 1024; const int kBufferSize = 16 * 1024;
void OnOpenSocket(const UsbDeviceProvider::SocketCallback& callback, void OnOpenSocket(const UsbDeviceProvider::SocketCallback& callback,
net::StreamSocket* socket_raw, net::StreamSocket* socket,
int result) { int result) {
scoped_ptr<net::StreamSocket> socket(socket_raw); callback.Run(result, result == net::OK ? socket : NULL);
if (result != net::OK)
socket.reset();
callback.Run(result, socket.Pass());
} }
void OnRead(net::StreamSocket* socket, void OnRead(net::StreamSocket* socket,
...@@ -71,8 +68,7 @@ void RunCommand(scoped_refptr<AndroidUsbDevice> device, ...@@ -71,8 +68,7 @@ void RunCommand(scoped_refptr<AndroidUsbDevice> device,
callback.Run(net::ERR_CONNECTION_FAILED, std::string()); callback.Run(net::ERR_CONNECTION_FAILED, std::string());
return; return;
} }
int result = socket->Connect( int result = socket->Connect(base::Bind(&OpenedForCommand, callback, socket));
base::Bind(&OpenedForCommand, callback, socket));
if (result != net::ERR_IO_PENDING) if (result != net::ERR_IO_PENDING)
callback.Run(result, std::string()); callback.Run(result, std::string());
} }
...@@ -111,21 +107,19 @@ void UsbDeviceProvider::OpenSocket(const std::string& serial, ...@@ -111,21 +107,19 @@ void UsbDeviceProvider::OpenSocket(const std::string& serial,
const SocketCallback& callback) { const SocketCallback& callback) {
UsbDeviceMap::iterator it = device_map_.find(serial); UsbDeviceMap::iterator it = device_map_.find(serial);
if (it == device_map_.end()) { if (it == device_map_.end()) {
callback.Run(net::ERR_CONNECTION_FAILED, callback.Run(net::ERR_CONNECTION_FAILED, NULL);
make_scoped_ptr<net::StreamSocket>(NULL));
return; return;
} }
std::string socket_name = std::string socket_name =
base::StringPrintf(kLocalAbstractCommand, name.c_str()); base::StringPrintf(kLocalAbstractCommand, name.c_str());
net::StreamSocket* socket = it->second->CreateSocket(socket_name); net::StreamSocket* socket = it->second->CreateSocket(socket_name);
if (!socket) { if (!socket) {
callback.Run(net::ERR_CONNECTION_FAILED, callback.Run(net::ERR_CONNECTION_FAILED, NULL);
make_scoped_ptr<net::StreamSocket>(NULL));
return; return;
} }
int result = socket->Connect(base::Bind(&OnOpenSocket, callback, socket)); int result = socket->Connect(base::Bind(&OnOpenSocket, callback, socket));
if (result != net::ERR_IO_PENDING) if (result != net::ERR_IO_PENDING)
callback.Run(result, make_scoped_ptr<net::StreamSocket>(NULL)); callback.Run(result, NULL);
} }
void UsbDeviceProvider::ReleaseDevice(const std::string& serial) { void UsbDeviceProvider::ReleaseDevice(const std::string& serial) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment