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

Unified Diff: third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h

Issue 2778123003: [scheduler] Add WakeupBudgetPool. (Closed)
Patch Set: First meaningful version Created 3 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h
index 9bcb72a6d65560b974d1c9330cd3a7d01a79cff8..5fa2058380b5ff148bd2e1f46aaaa7e2258e5a4d 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h
@@ -25,6 +25,7 @@ namespace scheduler {
class TaskQueue;
class BudgetPoolController;
+enum class QueueBlockType;
// BudgetPool represents a group of task queues which share a limit
// on a resource. This limit applies when task queues are already throttled
@@ -36,14 +37,28 @@ class BLINK_PLATFORM_EXPORT BudgetPool {
const char* Name() const;
// Report task run time to the budget pool.
- virtual void RecordTaskRunTime(base::TimeTicks start_time,
+ virtual void RecordTaskRunTime(TaskQueue* queue,
+ base::TimeTicks start_time,
base::TimeTicks end_time) = 0;
- // Retuns earliest time (can be in the past) when the next task can run.
- virtual base::TimeTicks GetNextAllowedRunTime() = 0;
+ // Returns earliest time when the next pump can be scheduled to run new tasks.
alex clarke (OOO till 29th) 2017/04/21 09:14:19 Returns the earliest...
altimin 2017/04/25 13:22:35 Done.
+ virtual base::TimeTicks GetNextAllowedRunTime(
+ base::TimeTicks desired_run_time) const = 0;
// Returns true at a task can be run immediately at the given time.
- virtual bool HasEnoughBudgetToRun(base::TimeTicks now) = 0;
+ virtual bool CanRunTasksAt(base::TimeTicks moment) const = 0;
+
+ // Returns true if tasks can run at any time up to |moment|.
+ virtual bool CanRunTasksUntil(base::TimeTicks now,
+ base::TimeTicks moment) const = 0;
+
+ // Notifies budget pool that queue has work with desired run time.
+ virtual void OnTaskQueueHasWork(TaskQueue* queue,
+ base::TimeTicks now,
+ base::TimeTicks desired_run_time) = 0;
+
+ // Notifies budget pool that wakeup has happened.
+ virtual void OnWakeup(base::TimeTicks now) = 0;
// Returns state for tracing.
virtual void AsValueInto(base::trace_event::TracedValue* state,
@@ -59,6 +74,9 @@ class BLINK_PLATFORM_EXPORT BudgetPool {
// is scheduled.
alex clarke (OOO till 29th) 2017/04/21 09:14:19 Maybe comment this schedules a wake up if needed.
altimin 2017/04/25 13:22:35 Done.
void RemoveQueue(base::TimeTicks now, TaskQueue* queue);
+ // Unlike RemoveQueue, does not schedule a new wakeup for the queue.
+ void UnregisterQueue(TaskQueue* queue);
+
// Enables this time budget pool. Queues from this pool will be
// throttled based on their run time.
void EnableThrottling(LazyNow* now);
@@ -80,6 +98,9 @@ class BLINK_PLATFORM_EXPORT BudgetPool {
protected:
BudgetPool(const char* name, BudgetPoolController* budget_pool_controller);
+ // Specify how this budget pool should block affected queues.
+ virtual QueueBlockType GetBlockType() const = 0;
+
const char* name_; // NOT OWNED
BudgetPoolController* budget_pool_controller_;
@@ -142,13 +163,23 @@ class BLINK_PLATFORM_EXPORT CPUTimeBudgetPool : public BudgetPool {
base::Callback<void(base::TimeDelta)> reporting_callback);
// BudgetPool implementation:
- void RecordTaskRunTime(base::TimeTicks start_time,
+ void RecordTaskRunTime(TaskQueue* queue,
+ base::TimeTicks start_time,
base::TimeTicks end_time) final;
- bool HasEnoughBudgetToRun(base::TimeTicks now) final;
- base::TimeTicks GetNextAllowedRunTime() final;
+ bool CanRunTasksUntil(base::TimeTicks now, base::TimeTicks until) const final;
+ bool CanRunTasksAt(base::TimeTicks now) const final;
+ base::TimeTicks GetNextAllowedRunTime(
+ base::TimeTicks desired_run_time) const final;
+ void OnTaskQueueHasWork(TaskQueue* queue,
+ base::TimeTicks now,
+ base::TimeTicks desired_run_time) final;
+ void OnWakeup(base::TimeTicks now) final;
void AsValueInto(base::trace_event::TracedValue* state,
base::TimeTicks now) const final;
+ protected:
+ QueueBlockType GetBlockType() const final;
+
private:
FRIEND_TEST_ALL_PREFIXES(TaskQueueThrottlerTest, CPUTimeBudgetPool);
@@ -184,6 +215,49 @@ class BLINK_PLATFORM_EXPORT CPUTimeBudgetPool : public BudgetPool {
DISALLOW_COPY_AND_ASSIGN(CPUTimeBudgetPool);
};
+// WakeupBudgetPool represents a collection of task queues which share a limit
+// on total cpu time.
+class BLINK_PLATFORM_EXPORT WakeupBudgetPool : public BudgetPool {
alex clarke (OOO till 29th) 2017/04/21 09:14:19 I think we should try to keep to 1 major class per
altimin 2017/04/25 13:22:35 I was thinking that these classes are too similar
alex clarke (OOO till 29th) 2017/04/27 10:28:14 Sorry to be a pain but I think we should separate
altimin 2017/04/27 11:07:40 Done.
+ public:
+ WakeupBudgetPool(const char* name,
+ BudgetPoolController* budget_pool_controller,
+ base::TimeTicks now);
+ ~WakeupBudgetPool();
alex clarke (OOO till 29th) 2017/04/21 09:14:19 override?
altimin 2017/04/25 13:22:35 Done.
+
+ void SetWakeupRate(base::TimeTicks now, double wakeups_per_second);
alex clarke (OOO till 29th) 2017/04/21 09:14:19 Why do we need to pass |now| into this? I notice
altimin 2017/04/25 13:22:35 Done.
+
+ void SetWakeupDuration(base::TimeTicks now, base::TimeDelta duration);
alex clarke (OOO till 29th) 2017/04/21 09:14:19 Same question.
altimin 2017/04/25 13:22:35 Done.
+
+ // BudgetPool implementation:
+ void RecordTaskRunTime(TaskQueue* queue,
+ base::TimeTicks start_time,
+ base::TimeTicks end_time) final;
+ bool CanRunTasksUntil(base::TimeTicks now,
+ base::TimeTicks moment) const final;
+ bool CanRunTasksAt(base::TimeTicks now) const final;
+ base::TimeTicks GetNextAllowedRunTime(
+ base::TimeTicks desired_run_time) const final;
+ void OnTaskQueueHasWork(TaskQueue* queue,
+ base::TimeTicks now,
+ base::TimeTicks desired_run_time) final;
+ void OnWakeup(base::TimeTicks now) final;
+ void AsValueInto(base::trace_event::TracedValue* state,
+ base::TimeTicks now) const final;
+
+ protected:
+ QueueBlockType GetBlockType() const final;
+
+ private:
+ base::TimeTicks NextWakeup() const;
+
+ double wakeups_per_second_;
+ base::TimeDelta wakeup_duration_;
+
+ base::TimeTicks last_wakeup_;
+
+ DISALLOW_COPY_AND_ASSIGN(WakeupBudgetPool);
+};
+
} // namespace scheduler
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698