Index: net/base/prioritized_dispatcher.cc |
=================================================================== |
--- net/base/prioritized_dispatcher.cc (revision 218288) |
+++ net/base/prioritized_dispatcher.cc (working copy) |
@@ -17,7 +17,8 @@ |
PrioritizedDispatcher::PrioritizedDispatcher(const Limits& limits) |
: queue_(limits.reserved_slots.size()), |
max_running_jobs_(limits.reserved_slots.size()), |
- num_running_jobs_(0) { |
+ num_running_jobs_(0), |
+ disabled_(false) { |
size_t total = 0; |
for (size_t i = 0; i < limits.reserved_slots.size(); ++i) { |
total += limits.reserved_slots[i]; |
@@ -37,7 +38,7 @@ |
Job* job, Priority priority) { |
DCHECK(job); |
DCHECK_LT(priority, num_priorities()); |
- if (num_running_jobs_ < max_running_jobs_[priority]) { |
+ if (!disabled_ && num_running_jobs_ < max_running_jobs_[priority]) { |
++num_running_jobs_; |
job->Start(); |
return Handle(); |
@@ -45,6 +46,18 @@ |
return queue_.Insert(job, priority); |
} |
+PrioritizedDispatcher::Handle PrioritizedDispatcher::AddAtHead( |
+ Job* job, Priority priority) { |
+ DCHECK(job); |
+ DCHECK_LT(priority, num_priorities()); |
+ if (!disabled_ && num_running_jobs_ < max_running_jobs_[priority]) { |
+ ++num_running_jobs_; |
+ job->Start(); |
+ return Handle(); |
+ } |
+ return queue_.InsertAtFront(job, priority); |
+} |
+ |
void PrioritizedDispatcher::Cancel(const Handle& handle) { |
queue_.Erase(handle); |
} |
@@ -86,10 +99,14 @@ |
MaybeDispatchJob(handle, handle.priority()); |
} |
+void PrioritizedDispatcher::Disable() { |
+ disabled_ = true; |
+} |
+ |
bool PrioritizedDispatcher::MaybeDispatchJob(const Handle& handle, |
Priority job_priority) { |
DCHECK_LT(job_priority, num_priorities()); |
- if (num_running_jobs_ >= max_running_jobs_[job_priority]) |
+ if (disabled_ || num_running_jobs_ >= max_running_jobs_[job_priority]) |
szym
2013/08/19 20:49:34
If instead of |disabled_|, you set max_running_job
mmenke
2013/08/19 21:09:59
Not sure why this didn't occur to me. It's pretty
|
return false; |
Job* job = handle.value(); |
queue_.Erase(handle); |