https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.hFile third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h
(right):
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h#newcode265third_party/WebKit/Source/platform/scheduler/base/task_queue_impl.h:265:
base::Optional<EnqueueOrder> current_enqueue_order;
This doesn't seem to be used?
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.ccFile
third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc
(right):
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc#newcode75third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc:75:
budget_pool_controller_->RemoveQueueFromBudgetPool(queue, this);
Would it be confusing to call UnregisterQueue(queue) here?
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc#newcode324third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc:324:
// Subtract 1 microsecond to work with time alignment in task queue
throttler.
What happens if you don't do that?
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc#newcode330third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc:330:
if (now < last_wakeup_ + wakeup_duration_)
Shouldn't that be <= ?
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc#newcode338third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc:338:
return now < last_wakeup_ + wakeup_duration_ &&
Ditto.
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc#newcode354third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc:354:
budget_pool_controller_->BlockQueue(GetBlockType(), now, queue);
Maybe swap the order of these to avoid the negation?
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.hFile third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h
(right):
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h#newcode44third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h:44:
// Returns earliest time when the next pump can be scheduled to run new
tasks.
Returns the earliest...
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h#newcode74third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h:74:
// is scheduled.
Maybe comment this schedules a wake up if needed.
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h#newcode220third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h:220:
class BLINK_PLATFORM_EXPORT WakeupBudgetPool : public BudgetPool {
I think we should try to keep to 1 major class per .cc / .h file (I know
we don't always do that, but files end up getting very long otherwise).
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h#newcode225third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h:225:
~WakeupBudgetPool();
override?
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h#newcode227third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h:227:
void SetWakeupRate(base::TimeTicks now, double wakeups_per_second);
Why do we need to pass |now| into this? I notice that there is a call
to:
GetMainThreadOnly().wake_up_budget_pool->SetWakeupRate(base::TimeTicks(),
1);
I notice there already is OnWakeup(base::TimeTicks now)
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h#newcode229third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h:229:
void SetWakeupDuration(base::TimeTicks now, base::TimeDelta duration);
Same question.
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.ccFile
third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc
(right):
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc#newcode41third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc:41:
time_zero_ = clock_->NowTicks();
I think start_time_ would be a better name.
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc#newcode49third_party/WebKit/Source/platform/scheduler/renderer/budget_pool_unittest.cc:49:
base::TimeTicks Milliseconds(int milliseconds) {
I'd prefer if this and the function below had an AfterStart postfix.
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.ccFile
third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc
(right):
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc#newcode149third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc:149:
if (iter->second.throttling_ref_count == 0)
That looks really weird. Is this papering over a bug elsewhere?
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc#newcode215third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc:215:
auto find_it = queue_details_.find(queue);
I don't remember off hand if return value optimization kicks in here.
Can this be const ref? (not needed if RVO happens).
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc#newcode237third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc:237:
for (const auto& it : budget_pools_)
uber nit: s/it/pair ;)
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc#newcode251third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc:251:
// This task queue does not any tasks.
Looks like you're missing a word in the comment.
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc#newcode252third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc:252:
task_queue->InsertFence(TaskQueue::InsertFencePosition::NOW);
Is it possible to get here? The queue has to be empty for
NextTaskRunTime to return nullopt right?
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc#newcode449third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc:449:
if (queue->HasFence())
I hope we don't get tempted to use fences for some other reason. Maybe
add a DCHECK when adding a queue to check there is no pre-existing
fence.
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc#newcode477third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.cc:477:
base::TimeTicks now,
I'm not 100% on this, but I wonder if things would be any simpler if we
left the clamping to |now| up to the caller.
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.hFile
third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h
(right):
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h#newcode35third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h:35:
enum class QueueBlockType { FULL, NEW_TASKS_ONLY };
These could do with some more documentation. I wonder if ALL_TASKS
might make the call sites easier to understand.
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h#newcode35third_party/WebKit/Source/platform/scheduler/renderer/task_queue_throttler.h:35:
enum class QueueBlockType { FULL, NEW_TASKS_ONLY };
Are you thinking of adding more blocking types? Currently there is a
1:1 mapping to fence type, do we need a new enum? (I'm not against
adding this btw)
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/public/platform/scheduler/base/task_queue.hFile third_party/WebKit/public/platform/scheduler/base/task_queue.h
(right):
https://codereview.chromium.org/2778123003/diff/40001/third_party/WebKit/public/platform/scheduler/base/task_queue.h#newcode225third_party/WebKit/public/platform/scheduler/base/task_queue.h:225:
virtual bool BlockedByFence() const = 0;
Please add: // Returns true if the queue has a fence which is blocking
execution of tasks.
https://codereview.chromium.org/2778123003/