Make TetheringAdbFilter ref-counted

BUG=None

Review URL: https://chromiumcodereview.appspot.com/22817003

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@217035 0039d316-1c4b-4281-b951-d872f2087c98
parent f5e6ffac
...@@ -55,7 +55,8 @@ class SocketTunnel { ...@@ -55,7 +55,8 @@ class SocketTunnel {
: location_(location), : location_(location),
pending_writes_(0), pending_writes_(0),
pending_destruction_(false), pending_destruction_(false),
callback_(callback) { callback_(callback),
about_to_destroy_(false) {
callback_.Run(1); callback_.Run(1);
} }
...@@ -101,6 +102,7 @@ class SocketTunnel { ...@@ -101,6 +102,7 @@ class SocketTunnel {
} }
~SocketTunnel() { ~SocketTunnel() {
about_to_destroy_ = true;
if (host_socket_) if (host_socket_)
host_socket_->Disconnect(); host_socket_->Disconnect();
if (remote_socket_) if (remote_socket_)
...@@ -187,6 +189,11 @@ class SocketTunnel { ...@@ -187,6 +189,11 @@ class SocketTunnel {
} }
void SelfDestruct() { void SelfDestruct() {
// In case one of the connections closes, we could get here
// from another one due to Disconnect firing back on all
// read callbacks.
if (about_to_destroy_)
return;
if (pending_writes_ > 0) { if (pending_writes_ > 0) {
pending_destruction_ = true; pending_destruction_ = true;
return; return;
...@@ -202,6 +209,7 @@ class SocketTunnel { ...@@ -202,6 +209,7 @@ class SocketTunnel {
int pending_writes_; int pending_writes_;
bool pending_destruction_; bool pending_destruction_;
CounterCallback callback_; CounterCallback callback_;
bool about_to_destroy_;
}; };
} // namespace } // namespace
...@@ -214,8 +222,7 @@ TetheringAdbFilter::TetheringAdbFilter( ...@@ -214,8 +222,7 @@ TetheringAdbFilter::TetheringAdbFilter(
: device_(device), : device_(device),
adb_message_loop_(adb_message_loop), adb_message_loop_(adb_message_loop),
web_socket_(web_socket), web_socket_(web_socket),
command_id_(0), command_id_(0) {
weak_factory_(this) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
pref_change_registrar_.Init(pref_service); pref_change_registrar_.Init(pref_service);
...@@ -255,8 +262,7 @@ void TetheringAdbFilter::OnPrefsChange() { ...@@ -255,8 +262,7 @@ void TetheringAdbFilter::OnPrefsChange() {
adb_message_loop_->PostTask( adb_message_loop_->PostTask(
FROM_HERE, FROM_HERE,
base::Bind(&TetheringAdbFilter::ChangeForwardingMap, base::Bind(&TetheringAdbFilter::ChangeForwardingMap,
weak_factory_.GetWeakPtr(), this, new_forwarding_map));
new_forwarding_map));
} }
void TetheringAdbFilter::ChangeForwardingMap(ForwardingMap new_forwarding_map) { void TetheringAdbFilter::ChangeForwardingMap(ForwardingMap new_forwarding_map) {
...@@ -290,7 +296,7 @@ void TetheringAdbFilter::SendCommand(const std::string& method, int port) { ...@@ -290,7 +296,7 @@ void TetheringAdbFilter::SendCommand(const std::string& method, int port) {
if (method == kTetheringBind) { if (method == kTetheringBind) {
pending_responses_[command.id()] = pending_responses_[command.id()] =
base::Bind(&TetheringAdbFilter::ProcessBindResponse, base::Bind(&TetheringAdbFilter::ProcessBindResponse,
weak_factory_.GetWeakPtr(), port); base::Unretained(this), port);
#if defined(DEBUG_DEVTOOLS) #if defined(DEBUG_DEVTOOLS)
port_status_[port] = kStatusConnecting; port_status_[port] = kStatusConnecting;
UpdatePortStatusMap(); UpdatePortStatusMap();
...@@ -308,7 +314,7 @@ void TetheringAdbFilter::SendCommand(const std::string& method, int port) { ...@@ -308,7 +314,7 @@ void TetheringAdbFilter::SendCommand(const std::string& method, int port) {
pending_responses_[command.id()] = pending_responses_[command.id()] =
base::Bind(&TetheringAdbFilter::ProcessUnbindResponse, base::Bind(&TetheringAdbFilter::ProcessUnbindResponse,
weak_factory_.GetWeakPtr(), port); base::Unretained(this), port);
#if defined(DEBUG_DEVTOOLS) #if defined(DEBUG_DEVTOOLS)
port_status_[port] = kStatusDisconnecting; port_status_[port] = kStatusDisconnecting;
UpdatePortStatusMap(); UpdatePortStatusMap();
...@@ -364,7 +370,7 @@ void TetheringAdbFilter::UpdateSocketCount(int port, int increment) { ...@@ -364,7 +370,7 @@ void TetheringAdbFilter::UpdateSocketCount(int port, int increment) {
void TetheringAdbFilter::UpdatePortStatusMap() { void TetheringAdbFilter::UpdatePortStatusMap() {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::Bind(&TetheringAdbFilter::UpdatePortStatusMapOnUIThread, base::Bind(&TetheringAdbFilter::UpdatePortStatusMapOnUIThread,
weak_factory_.GetWeakPtr(), port_status_)); this, port_status_));
} }
void TetheringAdbFilter::UpdatePortStatusMapOnUIThread( void TetheringAdbFilter::UpdatePortStatusMapOnUIThread(
...@@ -409,9 +415,7 @@ bool TetheringAdbFilter::ProcessIncomingMessage(const std::string& message) { ...@@ -409,9 +415,7 @@ bool TetheringAdbFilter::ProcessIncomingMessage(const std::string& message) {
std::string location = it->second; std::string location = it->second;
SocketTunnel* tunnel = new SocketTunnel(location, SocketTunnel* tunnel = new SocketTunnel(location,
base::Bind(&TetheringAdbFilter::UpdateSocketCount, base::Bind(&TetheringAdbFilter::UpdateSocketCount, this, port));
weak_factory_.GetWeakPtr(),
port));
device_->OpenSocket(connection_id.c_str(), device_->OpenSocket(connection_id.c_str(),
base::Bind(&SocketTunnel::Start, base::Unretained(tunnel))); base::Bind(&SocketTunnel::Start, base::Unretained(tunnel)));
...@@ -443,7 +447,7 @@ class PortForwardingController::Connection : public AdbWebSocket::Delegate { ...@@ -443,7 +447,7 @@ class PortForwardingController::Connection : public AdbWebSocket::Delegate {
base::MessageLoop* adb_message_loop_; base::MessageLoop* adb_message_loop_;
PrefService* pref_service_; PrefService* pref_service_;
scoped_ptr<TetheringAdbFilter> tethering_adb_filter_; scoped_refptr<TetheringAdbFilter> tethering_adb_filter_;
scoped_refptr<AdbWebSocket> web_socket_; scoped_refptr<AdbWebSocket> web_socket_;
}; };
...@@ -491,8 +495,8 @@ void PortForwardingController::Connection::OnSocketOpened() { ...@@ -491,8 +495,8 @@ void PortForwardingController::Connection::OnSocketOpened() {
return; return;
} }
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
tethering_adb_filter_.reset(new TetheringAdbFilter( tethering_adb_filter_ = new TetheringAdbFilter(
device_, adb_message_loop_, pref_service_, web_socket_)); device_, adb_message_loop_, pref_service_, web_socket_);
} }
void PortForwardingController::Connection::OnFrameRead( void PortForwardingController::Connection::OnFrameRead(
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include <string> #include <string>
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/memory/weak_ptr.h" #include "base/memory/ref_counted.h"
#include "base/prefs/pref_change_registrar.h" #include "base/prefs/pref_change_registrar.h"
#include "chrome/browser/devtools/adb_web_socket.h" #include "chrome/browser/devtools/adb_web_socket.h"
#include "chrome/browser/devtools/devtools_adb_bridge.h" #include "chrome/browser/devtools/devtools_adb_bridge.h"
...@@ -20,7 +20,9 @@ namespace base { ...@@ -20,7 +20,9 @@ namespace base {
class MessageLoop; class MessageLoop;
} }
class TetheringAdbFilter { class TetheringAdbFilter : public base::RefCountedThreadSafe<
TetheringAdbFilter,
content::BrowserThread::DeleteOnUIThread> {
public: public:
typedef DevToolsAdbBridge::RemoteDevice::PortStatus PortStatus; typedef DevToolsAdbBridge::RemoteDevice::PortStatus PortStatus;
typedef DevToolsAdbBridge::RemoteDevice::PortStatusMap PortStatusMap; typedef DevToolsAdbBridge::RemoteDevice::PortStatusMap PortStatusMap;
...@@ -29,13 +31,18 @@ class TetheringAdbFilter { ...@@ -29,13 +31,18 @@ class TetheringAdbFilter {
base::MessageLoop* adb_message_loop, base::MessageLoop* adb_message_loop,
PrefService* pref_service, PrefService* pref_service,
scoped_refptr<AdbWebSocket> web_socket); scoped_refptr<AdbWebSocket> web_socket);
~TetheringAdbFilter();
const PortStatusMap& GetPortStatusMap(); const PortStatusMap& GetPortStatusMap();
bool ProcessIncomingMessage(const std::string& message); bool ProcessIncomingMessage(const std::string& message);
private: private:
friend struct content::BrowserThread::DeleteOnThread<
content::BrowserThread::UI>;
friend class base::DeleteHelper<TetheringAdbFilter>;
virtual ~TetheringAdbFilter();
typedef std::map<int, std::string> ForwardingMap; typedef std::map<int, std::string> ForwardingMap;
typedef base::Callback<void(PortStatus)> CommandCallback; typedef base::Callback<void(PortStatus)> CommandCallback;
...@@ -67,7 +74,6 @@ class TetheringAdbFilter { ...@@ -67,7 +74,6 @@ class TetheringAdbFilter {
CommandCallbackMap pending_responses_; CommandCallbackMap pending_responses_;
PortStatusMap port_status_; PortStatusMap port_status_;
PortStatusMap port_status_on_ui_thread_; PortStatusMap port_status_on_ui_thread_;
base::WeakPtrFactory<TetheringAdbFilter> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(TetheringAdbFilter); DISALLOW_COPY_AND_ASSIGN(TetheringAdbFilter);
}; };
......
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