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

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

Issue 2008007: Replace about:net-internals with the javascript-based frontend.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: improve a comment Created 10 years, 7 months 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 | « net/base/host_resolver_impl.h ('k') | net/base/net_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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 #include <cmath> 7 #include <cmath>
8 #include <deque> 8 #include <deque>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 CompletionCallback* callback_; 148 CompletionCallback* callback_;
149 149
150 // The address list to save result into. 150 // The address list to save result into.
151 AddressList* addresses_; 151 AddressList* addresses_;
152 152
153 DISALLOW_COPY_AND_ASSIGN(Request); 153 DISALLOW_COPY_AND_ASSIGN(Request);
154 }; 154 };
155 155
156 //----------------------------------------------------------------------------- 156 //-----------------------------------------------------------------------------
157 157
158 // Threadsafe log.
159 class HostResolverImpl::RequestsTrace
160 : public base::RefCountedThreadSafe<HostResolverImpl::RequestsTrace> {
161 public:
162 RequestsTrace() {}
163
164 void Add(const std::string& msg) {
165 CapturingNetLog::Entry entry(NetLog::TYPE_TODO_STRING,
166 base::TimeTicks::Now(),
167 NetLog::Source(),
168 NetLog::PHASE_NONE,
169 new NetLogStringParameter("todo", msg));
170 AutoLock l(lock_);
171 entries_.push_back(entry);
172 }
173
174 void Get(CapturingNetLog::EntryList* entries) {
175 AutoLock l(lock_);
176 *entries = entries_;
177 }
178
179 void Clear() {
180 AutoLock l(lock_);
181 entries_.clear();
182 }
183
184 private:
185 Lock lock_;
186 CapturingNetLog::EntryList entries_;
187 };
188
189 //-----------------------------------------------------------------------------
190
191 // This class represents a request to the worker pool for a "getaddrinfo()" 158 // This class represents a request to the worker pool for a "getaddrinfo()"
192 // call. 159 // call.
193 class HostResolverImpl::Job 160 class HostResolverImpl::Job
194 : public base::RefCountedThreadSafe<HostResolverImpl::Job> { 161 : public base::RefCountedThreadSafe<HostResolverImpl::Job> {
195 public: 162 public:
196 Job(int id, HostResolverImpl* resolver, const Key& key, 163 Job(int id, HostResolverImpl* resolver, const Key& key)
197 RequestsTrace* requests_trace)
198 : id_(id), 164 : id_(id),
199 key_(key), 165 key_(key),
200 resolver_(resolver), 166 resolver_(resolver),
201 origin_loop_(MessageLoop::current()), 167 origin_loop_(MessageLoop::current()),
202 resolver_proc_(resolver->effective_resolver_proc()), 168 resolver_proc_(resolver->effective_resolver_proc()),
203 requests_trace_(requests_trace),
204 error_(OK), 169 error_(OK),
205 had_non_speculative_request_(false) { 170 had_non_speculative_request_(false) {
206 if (requests_trace_) {
207 requests_trace_->Add(StringPrintf(
208 "Created job j%d for {hostname='%s', address_family=%d}",
209 id_, key.hostname.c_str(),
210 static_cast<int>(key.address_family)));
211 }
212 } 171 }
213 172
214 // Attaches a request to this job. The job takes ownership of |req| and will 173 // Attaches a request to this job. The job takes ownership of |req| and will
215 // take care to delete it. 174 // take care to delete it.
216 void AddRequest(Request* req) { 175 void AddRequest(Request* req) {
217 if (requests_trace_) {
218 requests_trace_->Add(StringPrintf(
219 "Attached request r%d to job j%d", req->id(), id_));
220 }
221
222 req->set_job(this); 176 req->set_job(this);
223 requests_.push_back(req); 177 requests_.push_back(req);
224 178
225 if (!req->info().is_speculative()) 179 if (!req->info().is_speculative())
226 had_non_speculative_request_ = true; 180 had_non_speculative_request_ = true;
227 } 181 }
228 182
229 // Called from origin loop. 183 // Called from origin loop.
230 void Start() { 184 void Start() {
231 if (requests_trace_)
232 requests_trace_->Add(StringPrintf("Starting job j%d", id_));
233
234 start_time_ = base::TimeTicks::Now(); 185 start_time_ = base::TimeTicks::Now();
235 186
236 // Dispatch the job to a worker thread. 187 // Dispatch the job to a worker thread.
237 if (!WorkerPool::PostTask(FROM_HERE, 188 if (!WorkerPool::PostTask(FROM_HERE,
238 NewRunnableMethod(this, &Job::DoLookup), true)) { 189 NewRunnableMethod(this, &Job::DoLookup), true)) {
239 NOTREACHED(); 190 NOTREACHED();
240 191
241 // Since we could be running within Resolve() right now, we can't just 192 // Since we could be running within Resolve() right now, we can't just
242 // call OnLookupComplete(). Instead we must wait until Resolve() has 193 // call OnLookupComplete(). Instead we must wait until Resolve() has
243 // returned (IO_PENDING). 194 // returned (IO_PENDING).
244 error_ = ERR_UNEXPECTED; 195 error_ = ERR_UNEXPECTED;
245 MessageLoop::current()->PostTask( 196 MessageLoop::current()->PostTask(
246 FROM_HERE, NewRunnableMethod(this, &Job::OnLookupComplete)); 197 FROM_HERE, NewRunnableMethod(this, &Job::OnLookupComplete));
247 } 198 }
248 } 199 }
249 200
250 // Cancels the current job. Callable from origin thread. 201 // Cancels the current job. Callable from origin thread.
251 void Cancel() { 202 void Cancel() {
252 HostResolver* resolver = resolver_; 203 HostResolver* resolver = resolver_;
253 resolver_ = NULL; 204 resolver_ = NULL;
254 205
255 if (requests_trace_)
256 requests_trace_->Add(StringPrintf("Cancelled job j%d", id_));
257
258 // Mark the job as cancelled, so when worker thread completes it will 206 // Mark the job as cancelled, so when worker thread completes it will
259 // not try to post completion to origin loop. 207 // not try to post completion to origin loop.
260 { 208 {
261 AutoLock locked(origin_loop_lock_); 209 AutoLock locked(origin_loop_lock_);
262 origin_loop_ = NULL; 210 origin_loop_ = NULL;
263 } 211 }
264 212
265 // We will call HostResolverImpl::CancelRequest(Request*) on each one 213 // We will call HostResolverImpl::CancelRequest(Request*) on each one
266 // in order to notify any observers. 214 // in order to notify any observers.
267 for (RequestsList::const_iterator it = requests_.begin(); 215 for (RequestsList::const_iterator it = requests_.begin();
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
313 ~Job() { 261 ~Job() {
314 // Free the requests attached to this job. 262 // Free the requests attached to this job.
315 STLDeleteElements(&requests_); 263 STLDeleteElements(&requests_);
316 } 264 }
317 265
318 // WARNING: This code runs inside a worker pool. The shutdown code cannot 266 // WARNING: This code runs inside a worker pool. The shutdown code cannot
319 // wait for it to finish, so we must be very careful here about using other 267 // wait for it to finish, so we must be very careful here about using other
320 // objects (like MessageLoops, Singletons, etc). During shutdown these objects 268 // objects (like MessageLoops, Singletons, etc). During shutdown these objects
321 // may no longer exist. 269 // may no longer exist.
322 void DoLookup() { 270 void DoLookup() {
323 if (requests_trace_) {
324 requests_trace_->Add(StringPrintf(
325 "[resolver thread] Running job j%d", id_));
326 }
327
328 // Running on the worker thread 271 // Running on the worker thread
329 error_ = ResolveAddrInfo(resolver_proc_, 272 error_ = ResolveAddrInfo(resolver_proc_,
330 key_.hostname, 273 key_.hostname,
331 key_.address_family, 274 key_.address_family,
332 key_.host_resolver_flags, 275 key_.host_resolver_flags,
333 &results_); 276 &results_);
334 277
335 if (requests_trace_) {
336 requests_trace_->Add(StringPrintf(
337 "[resolver thread] Completed job j%d", id_));
338 }
339
340 // The origin loop could go away while we are trying to post to it, so we 278 // The origin loop could go away while we are trying to post to it, so we
341 // need to call its PostTask method inside a lock. See ~HostResolver. 279 // need to call its PostTask method inside a lock. See ~HostResolver.
342 { 280 {
343 AutoLock locked(origin_loop_lock_); 281 AutoLock locked(origin_loop_lock_);
344 if (origin_loop_) { 282 if (origin_loop_) {
345 origin_loop_->PostTask(FROM_HERE, 283 origin_loop_->PostTask(FROM_HERE,
346 NewRunnableMethod(this, &Job::OnLookupComplete)); 284 NewRunnableMethod(this, &Job::OnLookupComplete));
347 } 285 }
348 } 286 }
349 } 287 }
350 288
351 // Callback for when DoLookup() completes (runs on origin thread). 289 // Callback for when DoLookup() completes (runs on origin thread).
352 void OnLookupComplete() { 290 void OnLookupComplete() {
353 // Should be running on origin loop. 291 // Should be running on origin loop.
354 // TODO(eroman): this is being hit by URLRequestTest.CancelTest*, 292 // TODO(eroman): this is being hit by URLRequestTest.CancelTest*,
355 // because MessageLoop::current() == NULL. 293 // because MessageLoop::current() == NULL.
356 //DCHECK_EQ(origin_loop_, MessageLoop::current()); 294 //DCHECK_EQ(origin_loop_, MessageLoop::current());
357 DCHECK(error_ || results_.head()); 295 DCHECK(error_ || results_.head());
358 296
359 base::TimeDelta job_duration = base::TimeTicks::Now() - start_time_; 297 base::TimeDelta job_duration = base::TimeTicks::Now() - start_time_;
360 298
361 if (requests_trace_) {
362 requests_trace_->Add(StringPrintf(
363 "Completing job j%d (took %d milliseconds)",
364 id_,
365 static_cast<int>(job_duration.InMilliseconds())));
366 }
367
368 if (had_non_speculative_request_) { 299 if (had_non_speculative_request_) {
369 // TODO(eroman): Add histogram for job times of non-speculative 300 // TODO(eroman): Add histogram for job times of non-speculative
370 // requests. 301 // requests.
371 } 302 }
372 303
373 304
374 if (was_cancelled()) 305 if (was_cancelled())
375 return; 306 return;
376 307
377 DCHECK(!requests_.empty()); 308 DCHECK(!requests_.empty());
(...skipping 18 matching lines...) Expand all
396 // Used to post ourselves onto the origin thread. 327 // Used to post ourselves onto the origin thread.
397 Lock origin_loop_lock_; 328 Lock origin_loop_lock_;
398 MessageLoop* origin_loop_; 329 MessageLoop* origin_loop_;
399 330
400 // Hold an owning reference to the HostResolverProc that we are going to use. 331 // Hold an owning reference to the HostResolverProc that we are going to use.
401 // This may not be the current resolver procedure by the time we call 332 // This may not be the current resolver procedure by the time we call
402 // ResolveAddrInfo, but that's OK... we'll use it anyways, and the owning 333 // ResolveAddrInfo, but that's OK... we'll use it anyways, and the owning
403 // reference ensures that it remains valid until we are done. 334 // reference ensures that it remains valid until we are done.
404 scoped_refptr<HostResolverProc> resolver_proc_; 335 scoped_refptr<HostResolverProc> resolver_proc_;
405 336
406 // Thread safe log to write details into, or NULL.
407 scoped_refptr<RequestsTrace> requests_trace_;
408
409 // Assigned on the worker thread, read on the origin thread. 337 // Assigned on the worker thread, read on the origin thread.
410 int error_; 338 int error_;
411 339
412 // True if a non-speculative request was ever attached to this job 340 // True if a non-speculative request was ever attached to this job
413 // (regardless of whether or not it was later cancelled. 341 // (regardless of whether or not it was later cancelled.
414 // This boolean is used for histogramming the duration of jobs used to 342 // This boolean is used for histogramming the duration of jobs used to
415 // service non-speculative requests. 343 // service non-speculative requests.
416 bool had_non_speculative_request_; 344 bool had_non_speculative_request_;
417 345
418 AddressList results_; 346 AddressList results_;
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 void HostResolverImpl::Shutdown() { 789 void HostResolverImpl::Shutdown() {
862 shutdown_ = true; 790 shutdown_ = true;
863 791
864 // Cancel the outstanding jobs. 792 // Cancel the outstanding jobs.
865 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ++it) 793 for (JobMap::iterator it = jobs_.begin(); it != jobs_.end(); ++it)
866 it->second->Cancel(); 794 it->second->Cancel();
867 jobs_.clear(); 795 jobs_.clear();
868 DiscardIPv6ProbeJob(); 796 DiscardIPv6ProbeJob();
869 } 797 }
870 798
871 void HostResolverImpl::ClearRequestsTrace() {
872 if (requests_trace_)
873 requests_trace_->Clear();
874 }
875
876 void HostResolverImpl::EnableRequestsTracing(bool enable) {
877 requests_trace_ = enable ? new RequestsTrace : NULL;
878 if (enable) {
879 // Print the state of the world when logging was started.
880 requests_trace_->Add("Enabled tracing");
881 requests_trace_->Add(StringPrintf(
882 "Current num outstanding jobs: %d",
883 static_cast<int>(jobs_.size())));
884
885 // Dump all of the outstanding jobs.
886 if (!jobs_.empty()) {
887 for (JobMap::iterator job_it = jobs_.begin();
888 job_it != jobs_.end(); ++job_it) {
889 Job* job = job_it->second;
890
891 requests_trace_->Add(StringPrintf(
892 "Outstanding job j%d for {host='%s', address_family=%d}, "
893 "which was started at t=%d",
894 job->id(),
895 job->key().hostname.c_str(),
896 static_cast<int>(job->key().address_family),
897 static_cast<int>((job->start_time() - base::TimeTicks())
898 .InMilliseconds())));
899
900 // Dump all of the requests attached to this job.
901 for (RequestsList::const_iterator req_it = job->requests().begin();
902 req_it != job->requests().end(); ++req_it) {
903 Request* req = *req_it;
904 requests_trace_->Add(StringPrintf(
905 " %sOutstanding request r%d is attached to job j%d "
906 "{priority=%d, speculative=%d, referrer='%s'}",
907 req->was_cancelled() ? "[CANCELLED] " : "",
908 req->id(),
909 job->id(),
910 static_cast<int>(req->info().priority()),
911 static_cast<int>(req->info().is_speculative()),
912 req->info().referrer().spec().c_str()));
913 }
914 }
915 }
916
917 size_t total = 0u;
918 for (size_t i = 0; i < arraysize(job_pools_); ++i)
919 total += job_pools_[i]->GetNumPendingRequests();
920
921 requests_trace_->Add(StringPrintf(
922 "Number of queued requests: %d", static_cast<int>(total)));
923 }
924 }
925
926 bool HostResolverImpl::IsRequestsTracingEnabled() const {
927 return !!requests_trace_; // Cast to bool.
928 }
929
930 bool HostResolverImpl::GetRequestsTrace(CapturingNetLog::EntryList* entries) {
931 if (!requests_trace_)
932 return false;
933 requests_trace_->Get(entries);
934 return true;
935 }
936
937 void HostResolverImpl::SetPoolConstraints(JobPoolIndex pool_index, 799 void HostResolverImpl::SetPoolConstraints(JobPoolIndex pool_index,
938 size_t max_outstanding_jobs, 800 size_t max_outstanding_jobs,
939 size_t max_pending_requests) { 801 size_t max_pending_requests) {
940 CHECK_GE(pool_index, 0); 802 CHECK_GE(pool_index, 0);
941 CHECK_LT(pool_index, POOL_COUNT); 803 CHECK_LT(pool_index, POOL_COUNT);
942 CHECK(jobs_.empty()) << "Can only set constraints during setup"; 804 CHECK(jobs_.empty()) << "Can only set constraints during setup";
943 JobPool* pool = job_pools_[pool_index]; 805 JobPool* pool = job_pools_[pool_index];
944 pool->SetConstraints(max_outstanding_jobs, max_pending_requests); 806 pool->SetConstraints(max_outstanding_jobs, max_pending_requests);
945 } 807 }
946 808
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 } 869 }
1008 870
1009 cur_completing_job_ = NULL; 871 cur_completing_job_ = NULL;
1010 } 872 }
1011 873
1012 void HostResolverImpl::OnStartRequest(const BoundNetLog& net_log, 874 void HostResolverImpl::OnStartRequest(const BoundNetLog& net_log,
1013 int request_id, 875 int request_id,
1014 const RequestInfo& info) { 876 const RequestInfo& info) {
1015 net_log.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL, NULL); 877 net_log.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL, NULL);
1016 878
1017 if (requests_trace_) {
1018 requests_trace_->Add(StringPrintf(
1019 "Received request r%d for {hostname='%s', port=%d, priority=%d, "
1020 "speculative=%d, address_family=%d, allow_cached=%d, referrer='%s'}",
1021 request_id,
1022 info.hostname().c_str(),
1023 info.port(),
1024 static_cast<int>(info.priority()),
1025 static_cast<int>(info.is_speculative()),
1026 static_cast<int>(info.address_family()),
1027 static_cast<int>(info.allow_cached_response()),
1028 info.referrer().spec().c_str()));
1029 }
1030
1031 // Notify the observers of the start. 879 // Notify the observers of the start.
1032 if (!observers_.empty()) { 880 if (!observers_.empty()) {
1033 net_log.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONSTART, NULL); 881 net_log.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONSTART, NULL);
1034 882
1035 for (ObserversList::iterator it = observers_.begin(); 883 for (ObserversList::iterator it = observers_.begin();
1036 it != observers_.end(); ++it) { 884 it != observers_.end(); ++it) {
1037 (*it)->OnStartResolution(request_id, info); 885 (*it)->OnStartResolution(request_id, info);
1038 } 886 }
1039 887
1040 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONSTART, NULL); 888 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONSTART, NULL);
1041 } 889 }
1042 } 890 }
1043 891
1044 void HostResolverImpl::OnFinishRequest(const BoundNetLog& net_log, 892 void HostResolverImpl::OnFinishRequest(const BoundNetLog& net_log,
1045 int request_id, 893 int request_id,
1046 const RequestInfo& info, 894 const RequestInfo& info,
1047 int error) { 895 int error) {
1048 if (requests_trace_) {
1049 requests_trace_->Add(StringPrintf(
1050 "Finished request r%d with error=%d", request_id, error));
1051 }
1052
1053 // Notify the observers of the completion. 896 // Notify the observers of the completion.
1054 if (!observers_.empty()) { 897 if (!observers_.empty()) {
1055 net_log.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONFINISH, NULL); 898 net_log.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONFINISH, NULL);
1056 899
1057 bool was_resolved = error == OK; 900 bool was_resolved = error == OK;
1058 for (ObserversList::iterator it = observers_.begin(); 901 for (ObserversList::iterator it = observers_.begin();
1059 it != observers_.end(); ++it) { 902 it != observers_.end(); ++it) {
1060 (*it)->OnFinishResolutionWithStatus(request_id, was_resolved, info); 903 (*it)->OnFinishResolutionWithStatus(request_id, was_resolved, info);
1061 } 904 }
1062 905
1063 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONFINISH, NULL); 906 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONFINISH, NULL);
1064 } 907 }
1065 908
1066 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL, NULL); 909 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL, NULL);
1067 } 910 }
1068 911
1069 void HostResolverImpl::OnCancelRequest(const BoundNetLog& net_log, 912 void HostResolverImpl::OnCancelRequest(const BoundNetLog& net_log,
1070 int request_id, 913 int request_id,
1071 const RequestInfo& info) { 914 const RequestInfo& info) {
1072 net_log.AddEvent(NetLog::TYPE_CANCELLED, NULL); 915 net_log.AddEvent(NetLog::TYPE_CANCELLED, NULL);
1073 916
1074 if (requests_trace_)
1075 requests_trace_->Add(StringPrintf("Cancelled request r%d", request_id));
1076
1077 // Notify the observers of the cancellation. 917 // Notify the observers of the cancellation.
1078 if (!observers_.empty()) { 918 if (!observers_.empty()) {
1079 net_log.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONCANCEL, NULL); 919 net_log.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONCANCEL, NULL);
1080 920
1081 for (ObserversList::iterator it = observers_.begin(); 921 for (ObserversList::iterator it = observers_.begin();
1082 it != observers_.end(); ++it) { 922 it != observers_.end(); ++it) {
1083 (*it)->OnCancelResolution(request_id, info); 923 (*it)->OnCancelResolution(request_id, info);
1084 } 924 }
1085 925
1086 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONCANCEL, NULL); 926 net_log.EndEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_OBSERVER_ONCANCEL, NULL);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1169 AddressFamily effective_address_family = info.address_family(); 1009 AddressFamily effective_address_family = info.address_family();
1170 if (effective_address_family == ADDRESS_FAMILY_UNSPECIFIED) 1010 if (effective_address_family == ADDRESS_FAMILY_UNSPECIFIED)
1171 effective_address_family = default_address_family_; 1011 effective_address_family = default_address_family_;
1172 return Key(info.hostname(), effective_address_family, 1012 return Key(info.hostname(), effective_address_family,
1173 info.host_resolver_flags()); 1013 info.host_resolver_flags());
1174 } 1014 }
1175 1015
1176 HostResolverImpl::Job* HostResolverImpl::CreateAndStartJob(Request* req) { 1016 HostResolverImpl::Job* HostResolverImpl::CreateAndStartJob(Request* req) {
1177 DCHECK(CanCreateJobForPool(*GetPoolForRequest(req))); 1017 DCHECK(CanCreateJobForPool(*GetPoolForRequest(req)));
1178 Key key = GetEffectiveKeyForRequest(req->info()); 1018 Key key = GetEffectiveKeyForRequest(req->info());
1179 scoped_refptr<Job> job = new Job(next_job_id_++, this, key, requests_trace_); 1019 scoped_refptr<Job> job = new Job(next_job_id_++, this, key);
1180 job->AddRequest(req); 1020 job->AddRequest(req);
1181 AddOutstandingJob(job); 1021 AddOutstandingJob(job);
1182 job->Start(); 1022 job->Start();
1183 return job.get(); 1023 return job.get();
1184 } 1024 }
1185 1025
1186 int HostResolverImpl::EnqueueRequest(JobPool* pool, Request* req) { 1026 int HostResolverImpl::EnqueueRequest(JobPool* pool, Request* req) {
1187 if (requests_trace_)
1188 requests_trace_->Add(StringPrintf("Queued request r%d", req->id()));
1189
1190 scoped_ptr<Request> req_evicted_from_queue( 1027 scoped_ptr<Request> req_evicted_from_queue(
1191 pool->InsertPendingRequest(req)); 1028 pool->InsertPendingRequest(req));
1192 1029
1193 // If the queue has become too large, we need to kick something out. 1030 // If the queue has become too large, we need to kick something out.
1194 if (req_evicted_from_queue.get()) { 1031 if (req_evicted_from_queue.get()) {
1195 Request* r = req_evicted_from_queue.get(); 1032 Request* r = req_evicted_from_queue.get();
1196 int error = ERR_HOST_RESOLVER_QUEUE_TOO_LARGE; 1033 int error = ERR_HOST_RESOLVER_QUEUE_TOO_LARGE;
1197 1034
1198 if (requests_trace_)
1199 requests_trace_->Add(StringPrintf("Evicted request r%d", r->id()));
1200
1201 OnFinishRequest(r->net_log(), r->id(), r->info(), error); 1035 OnFinishRequest(r->net_log(), r->id(), r->info(), error);
1202 1036
1203 if (r == req) 1037 if (r == req)
1204 return error; 1038 return error;
1205 1039
1206 r->OnComplete(error, AddressList()); 1040 r->OnComplete(error, AddressList());
1207 } 1041 }
1208 1042
1209 return ERR_IO_PENDING; 1043 return ERR_IO_PENDING;
1210 } 1044 }
1211 1045
1212 } // namespace net 1046 } // namespace net
OLDNEW
« no previous file with comments | « net/base/host_resolver_impl.h ('k') | net/base/net_log.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698