| Index: net/base/host_resolver.cc
|
| ===================================================================
|
| --- net/base/host_resolver.cc (revision 9316)
|
| +++ net/base/host_resolver.cc (working copy)
|
| @@ -63,8 +63,9 @@
|
|
|
| //-----------------------------------------------------------------------------
|
|
|
| -class HostResolver::Request :
|
| - public base::RefCountedThreadSafe<HostResolver::Request> {
|
| +class HostResolver::Request
|
| + : public base::RefCountedThreadSafe<HostResolver::Request>,
|
| + public MessageLoop::DestructionObserver {
|
| public:
|
| Request(HostResolver* resolver,
|
| const std::string& host,
|
| @@ -80,9 +81,10 @@
|
| host_mapper_(host_mapper),
|
| error_(OK),
|
| results_(NULL) {
|
| + MessageLoop::current()->AddDestructionObserver(this);
|
| }
|
|
|
| - ~Request() {
|
| + virtual ~Request() {
|
| if (results_)
|
| freeaddrinfo(results_);
|
| }
|
| @@ -111,6 +113,12 @@
|
| // Running on the origin thread.
|
| DCHECK(error_ || results_);
|
|
|
| + {
|
| + AutoLock locked(origin_loop_lock_);
|
| + if (origin_loop_)
|
| + origin_loop_->RemoveDestructionObserver(this);
|
| + }
|
| +
|
| // We may have been cancelled!
|
| if (!resolver_)
|
| return;
|
| @@ -135,6 +143,11 @@
|
| origin_loop_ = NULL;
|
| }
|
|
|
| + virtual void WillDestroyCurrentMessageLoop() {
|
| + AutoLock locked(origin_loop_lock_);
|
| + origin_loop_ = NULL;
|
| + }
|
| +
|
| private:
|
| // Set on the origin thread, read on the worker thread.
|
| std::string host_;
|
| @@ -169,8 +182,10 @@
|
| }
|
|
|
| HostResolver::~HostResolver() {
|
| - if (request_)
|
| + if (request_) {
|
| request_->Cancel();
|
| + MessageLoop::current()->RemoveDestructionObserver(request_.get());
|
| + }
|
| }
|
|
|
| int HostResolver::Resolve(const std::string& hostname, int port,
|
| @@ -195,6 +210,7 @@
|
| if (!WorkerPool::PostTask(FROM_HERE,
|
| NewRunnableMethod(request_.get(), &Request::DoLookup), true)) {
|
| NOTREACHED();
|
| + MessageLoop::current()->RemoveDestructionObserver(request_.get());
|
| request_ = NULL;
|
| return ERR_FAILED;
|
| }
|
|
|