Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1148)

Side by Side Diff: net/base/host_resolver_impl.cc

Issue 347021: Make LoadLog refcounted-thread safe.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Address timurrr's comment change Created 11 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | net/base/load_log.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/base/host_resolver_impl.h" 5 #include "net/base/host_resolver_impl.h"
6 6
7 #if defined(OS_WIN) 7 #if defined(OS_WIN)
8 #include <ws2tcpip.h> 8 #include <ws2tcpip.h>
9 #include <wspiapi.h> // Needed for Win2k compat. 9 #include <wspiapi.h> // Needed for Win2k compat.
10 #elif defined(OS_POSIX) 10 #elif defined(OS_POSIX)
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 job_(NULL), 68 job_(NULL),
69 callback_(callback), 69 callback_(callback),
70 addresses_(addresses) { 70 addresses_(addresses) {
71 } 71 }
72 72
73 // Mark the request as cancelled. 73 // Mark the request as cancelled.
74 void MarkAsCancelled() { 74 void MarkAsCancelled() {
75 job_ = NULL; 75 job_ = NULL;
76 callback_ = NULL; 76 callback_ = NULL;
77 addresses_ = NULL; 77 addresses_ = NULL;
78 // Clear the LoadLog to make sure it won't be released later on the
79 // worker thread. See http://crbug.com/22272
80 load_log_ = NULL;
81 } 78 }
82 79
83 bool was_cancelled() const { 80 bool was_cancelled() const {
84 return callback_ == NULL; 81 return callback_ == NULL;
85 } 82 }
86 83
87 void set_job(Job* job) { 84 void set_job(Job* job) {
88 DCHECK(job != NULL); 85 DCHECK(job != NULL);
89 // Identify which job the request is waiting on. 86 // Identify which job the request is waiting on.
90 job_ = job; 87 job_ = job;
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 resolver_ = NULL; 183 resolver_ = NULL;
187 184
188 // Mark the job as cancelled, so when worker thread completes it will 185 // Mark the job as cancelled, so when worker thread completes it will
189 // not try to post completion to origin loop. 186 // not try to post completion to origin loop.
190 { 187 {
191 AutoLock locked(origin_loop_lock_); 188 AutoLock locked(origin_loop_lock_);
192 origin_loop_ = NULL; 189 origin_loop_ = NULL;
193 } 190 }
194 191
195 // We will call HostResolverImpl::CancelRequest(Request*) on each one 192 // We will call HostResolverImpl::CancelRequest(Request*) on each one
196 // in order to notify any observers, and also clear the LoadLog. 193 // in order to notify any observers.
197 for (RequestsList::const_iterator it = requests_.begin(); 194 for (RequestsList::const_iterator it = requests_.begin();
198 it != requests_.end(); ++it) { 195 it != requests_.end(); ++it) {
199 HostResolverImpl::Request* req = *it; 196 HostResolverImpl::Request* req = *it;
200 if (!req->was_cancelled()) 197 if (!req->was_cancelled())
201 resolver->CancelRequest(req); 198 resolver->CancelRequest(req);
202 } 199 }
203 } 200 }
204 201
205 // Called from origin thread. 202 // Called from origin thread.
206 bool was_cancelled() const { 203 bool was_cancelled() const {
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 // TODO(eroman): temp hack for: http://crbug.com/18373 400 // TODO(eroman): temp hack for: http://crbug.com/18373
404 // Because we destroy outstanding requests during Shutdown(), 401 // Because we destroy outstanding requests during Shutdown(),
405 // |req_handle| is already cancelled. 402 // |req_handle| is already cancelled.
406 LOG(ERROR) << "Called HostResolverImpl::CancelRequest() after Shutdown()."; 403 LOG(ERROR) << "Called HostResolverImpl::CancelRequest() after Shutdown().";
407 StackTrace().PrintBacktrace(); 404 StackTrace().PrintBacktrace();
408 return; 405 return;
409 } 406 }
410 Request* req = reinterpret_cast<Request*>(req_handle); 407 Request* req = reinterpret_cast<Request*>(req_handle);
411 DCHECK(req); 408 DCHECK(req);
412 DCHECK(req->job()); 409 DCHECK(req->job());
413 // Hold a reference to the request's load log as we are about to clear it.
414 scoped_refptr<LoadLog> load_log(req->load_log());
415 // NULL out the fields of req, to mark it as cancelled. 410 // NULL out the fields of req, to mark it as cancelled.
416 req->MarkAsCancelled(); 411 req->MarkAsCancelled();
417 OnCancelRequest(load_log, req->id(), req->info()); 412 OnCancelRequest(req->load_log(), req->id(), req->info());
418 } 413 }
419 414
420 void HostResolverImpl::AddObserver(Observer* observer) { 415 void HostResolverImpl::AddObserver(Observer* observer) {
421 observers_.push_back(observer); 416 observers_.push_back(observer);
422 } 417 }
423 418
424 void HostResolverImpl::RemoveObserver(Observer* observer) { 419 void HostResolverImpl::RemoveObserver(Observer* observer) {
425 ObserversList::iterator it = 420 ObserversList::iterator it =
426 std::find(observers_.begin(), observers_.end(), observer); 421 std::find(observers_.begin(), observers_.end(), observer);
427 422
(...skipping 30 matching lines...) Expand all
458 } 453 }
459 454
460 void HostResolverImpl::RemoveOutstandingJob(Job* job) { 455 void HostResolverImpl::RemoveOutstandingJob(Job* job) {
461 JobMap::iterator it = jobs_.find(job->key()); 456 JobMap::iterator it = jobs_.find(job->key());
462 DCHECK(it != jobs_.end()); 457 DCHECK(it != jobs_.end());
463 DCHECK_EQ(it->second.get(), job); 458 DCHECK_EQ(it->second.get(), job);
464 jobs_.erase(it); 459 jobs_.erase(it);
465 } 460 }
466 461
467 void HostResolverImpl::OnJobComplete(Job* job, 462 void HostResolverImpl::OnJobComplete(Job* job,
468 int error, 463 int error,
469 const AddressList& addrlist) { 464 const AddressList& addrlist) {
470 RemoveOutstandingJob(job); 465 RemoveOutstandingJob(job);
471 466
472 // Write result to the cache. 467 // Write result to the cache.
473 cache_.Set(job->key(), error, addrlist, base::TimeTicks::Now()); 468 cache_.Set(job->key(), error, addrlist, base::TimeTicks::Now());
474 469
475 // Make a note that we are executing within OnJobComplete() in case the 470 // Make a note that we are executing within OnJobComplete() in case the
476 // HostResolver is deleted by a callback invocation. 471 // HostResolver is deleted by a callback invocation.
477 DCHECK(!cur_completing_job_); 472 DCHECK(!cur_completing_job_);
478 cur_completing_job_ = job; 473 cur_completing_job_ = job;
479 474
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
557 } 552 }
558 553
559 LoadLog::EndEvent( 554 LoadLog::EndEvent(
560 load_log, LoadLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONCANCEL); 555 load_log, LoadLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONCANCEL);
561 } 556 }
562 557
563 LoadLog::EndEvent(load_log, LoadLog::TYPE_HOST_RESOLVER_IMPL); 558 LoadLog::EndEvent(load_log, LoadLog::TYPE_HOST_RESOLVER_IMPL);
564 } 559 }
565 560
566 } // namespace net 561 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/base/load_log.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698