Chromium Code Reviews| Index: net/base/prioritized_dispatcher.cc |
| =================================================================== |
| --- net/base/prioritized_dispatcher.cc (revision 218288) |
| +++ net/base/prioritized_dispatcher.cc (working copy) |
| @@ -18,17 +18,7 @@ |
| : queue_(limits.reserved_slots.size()), |
| max_running_jobs_(limits.reserved_slots.size()), |
| num_running_jobs_(0) { |
| - size_t total = 0; |
| - for (size_t i = 0; i < limits.reserved_slots.size(); ++i) { |
| - total += limits.reserved_slots[i]; |
| - max_running_jobs_[i] = total; |
| - } |
| - // Unreserved slots are available for all priorities. |
| - DCHECK_LE(total, limits.total_jobs) << "sum(reserved_slots) <= total_jobs"; |
| - size_t spare = limits.total_jobs - total; |
| - for (size_t i = limits.reserved_slots.size(); i > 0; --i) { |
| - max_running_jobs_[i - 1] += spare; |
| - } |
| + SetLimits(limits); |
| } |
| PrioritizedDispatcher::~PrioritizedDispatcher() {} |
| @@ -45,6 +35,18 @@ |
| return queue_.Insert(job, priority); |
| } |
| +PrioritizedDispatcher::Handle PrioritizedDispatcher::AddAtHead( |
| + Job* job, Priority priority) { |
| + DCHECK(job); |
| + DCHECK_LT(priority, num_priorities()); |
| + if (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,6 +88,11 @@ |
| MaybeDispatchJob(handle, handle.priority()); |
| } |
| +void PrioritizedDispatcher::Disable() { |
| + // Set limits to allow no new jobs to start. |
| + SetLimits(Limits(queue_.NumPriorities(), 0)); |
| +} |
| + |
| bool PrioritizedDispatcher::MaybeDispatchJob(const Handle& handle, |
| Priority job_priority) { |
| DCHECK_LT(job_priority, num_priorities()); |
| @@ -98,4 +105,18 @@ |
| return true; |
| } |
| +void PrioritizedDispatcher::SetLimits(const Limits& limits) { |
|
szym
2013/08/20 16:24:57
suggest adding
DCHECK_EQ(queue_.num_priorities(),
mmenke
2013/08/20 16:33:13
SGTM. Done.
|
| + size_t total = 0; |
| + for (size_t i = 0; i < limits.reserved_slots.size(); ++i) { |
| + total += limits.reserved_slots[i]; |
| + max_running_jobs_[i] = total; |
| + } |
| + // Unreserved slots are available for all priorities. |
| + DCHECK_LE(total, limits.total_jobs) << "sum(reserved_slots) <= total_jobs"; |
| + size_t spare = limits.total_jobs - total; |
| + for (size_t i = limits.reserved_slots.size(); i > 0; --i) { |
| + max_running_jobs_[i - 1] += spare; |
| + } |
| +} |
| + |
| } // namespace net |