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

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

Issue 2741473002: [scheduler] Move TimeBudgetPool to a separate file. (Closed)
Patch Set: Addressed comments from alexclarke@ Created 3 years, 9 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
new file mode 100644
index 0000000000000000000000000000000000000000..e602b93a5ed587bcba7bc85ceee0c20513aac65b
--- /dev/null
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.h
@@ -0,0 +1,168 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_BUDGET_POOL_H_
+#define THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_BUDGET_POOL_H_
+
+#include <unordered_set>
+
+#include "base/callback.h"
+#include "base/gtest_prod_util.h"
+#include "base/macros.h"
+#include "base/optional.h"
+#include "base/time/time.h"
+#include "platform/scheduler/base/lazy_now.h"
+
+namespace base {
+namespace trace_event {
+class TracedValue;
+}
+}
+
+namespace blink {
+namespace scheduler {
+
+class TaskQueue;
+class TaskQueueThrottler;
+
+// BudgetPool represents a group of task queues which share a limit
+// on a resource. This limit applies when task queues are already throttled
+// by TaskQueueThrottler.
+class BLINK_PLATFORM_EXPORT BudgetPool {
+ public:
+ virtual ~BudgetPool();
+
+ virtual const char* Name() const = 0;
+
+ // Adds |queue| to given pool. If the pool restriction does not allow
+ // a task to be run immediately and |queue| is throttled, |queue| becomes
+ // disabled.
+ virtual void AddQueue(base::TimeTicks now, TaskQueue* queue) = 0;
+
+ // Removes |queue| from given pool. If it is throttled, it does not
+ // become enabled immediately, but a call to |PumpThrottledTasks|
+ // is scheduled.
+ virtual void RemoveQueue(base::TimeTicks now, TaskQueue* queue) = 0;
+
+ // Enables this time budget pool. Queues from this pool will be
+ // throttled based on their run time.
+ virtual void EnableThrottling(LazyNow* now) = 0;
+
+ // Disables with time budget pool. Queues from this pool will not be
+ // throttled based on their run time. A call to |PumpThrottledTasks|
+ // will be scheduled to enable this queues back again and respect
+ // timer alignment. Internal budget level will not regenerate with time.
+ virtual void DisableThrottling(LazyNow* now) = 0;
+
+ virtual bool IsThrottlingEnabled() const = 0;
+
+ // Report task run time to the budget pool.
+ virtual void RecordTaskRunTime(base::TimeTicks start_time,
+ base::TimeTicks end_time) = 0;
+
+ // All queues should be removed before calling Close().
+ virtual void Close() = 0;
+
+ // Retuns earliest time (can be in the past) when the next task can run.
+ virtual base::TimeTicks GetNextAllowedRunTime() = 0;
+
+ // Returns true at a task can be run immediately at the given time.
+ virtual bool HasEnoughBudgetToRun(base::TimeTicks now) = 0;
+
+ // Returns state for tracing.
+ virtual void AsValueInto(base::trace_event::TracedValue* state,
+ base::TimeTicks now) const = 0;
+};
+
+// CPUTimeBudgetPool represents a collection of task queues which share a limit
+// on total cpu time.
+class BLINK_PLATFORM_EXPORT CPUTimeBudgetPool : public BudgetPool {
+ public:
+ ~CPUTimeBudgetPool();
+
+ // Throttle task queues from this time budget pool if tasks are running
+ // for more than |cpu_percentage| per cent of wall time.
+ // This function does not affect internal time budget level.
+ void SetTimeBudgetRecoveryRate(base::TimeTicks now, double cpu_percentage);
+
+ // Increase budget level by given value. This function DOES NOT unblock
+ // queues even if they are allowed to run with increased budget level.
+ void GrantAdditionalBudget(base::TimeTicks now, base::TimeDelta budget_level);
+
+ // Set callback which will be called every time when this budget pool
+ // is throttled. Throttling duration (time until the queue is allowed
+ // to run again) is passed as a parameter to callback.
+ void SetReportingCallback(
+ base::Callback<void(base::TimeDelta)> reporting_callback);
+
+ // BudgetPool implementation:
+ const char* Name() const override;
+ void AddQueue(base::TimeTicks now, TaskQueue* queue) override;
+ void RemoveQueue(base::TimeTicks now, TaskQueue* queue) override;
+ void EnableThrottling(LazyNow* now) override;
+ void DisableThrottling(LazyNow* now) override;
+ bool IsThrottlingEnabled() const override;
+ void RecordTaskRunTime(base::TimeTicks start_time,
+ base::TimeTicks end_time) override;
+ void Close() override;
+ bool HasEnoughBudgetToRun(base::TimeTicks now) override;
+ base::TimeTicks GetNextAllowedRunTime() override;
+ void AsValueInto(base::trace_event::TracedValue* state,
+ base::TimeTicks now) const override;
+
+ private:
+ friend class TaskQueueThrottler;
+
+ FRIEND_TEST_ALL_PREFIXES(TaskQueueThrottlerTest, CPUTimeBudgetPool);
+
+ CPUTimeBudgetPool(const char* name,
+ TaskQueueThrottler* task_queue_throttler,
+ base::TimeTicks now,
+ base::Optional<base::TimeDelta> max_budget_level,
+ base::Optional<base::TimeDelta> max_throttling_duration);
+
+ // Advances |last_checkpoint_| to |now| if needed and recalculates
+ // budget level.
+ void Advance(base::TimeTicks now);
+
+ // Disable all associated throttled queues.
+ void BlockThrottledQueues(base::TimeTicks now);
+
+ // Increase |current_budget_level_| to satisfy max throttling duration
+ // condition if necessary.
+ // Decrease |current_budget_level_| to satisfy max budget level
+ // condition if necessary.
+ void EnforceBudgetLevelRestrictions();
+
+ const char* name_; // NOT OWNED
+
+ TaskQueueThrottler* task_queue_throttler_;
+
+ // Max budget level which we can accrue.
+ // Tasks will be allowed to run for this time before being throttled
+ // after a very long period of inactivity.
+ base::Optional<base::TimeDelta> max_budget_level_;
+ // Max throttling duration places a lower limit on time budget level,
+ // ensuring that one long task does not cause extremely long throttling.
+ // Note that this is not the guarantee that every task will run
+ // after desired run time + max throttling duration, but a guarantee
+ // that at least one task will be run every max_throttling_duration.
+ base::Optional<base::TimeDelta> max_throttling_duration_;
+
+ base::TimeDelta current_budget_level_;
+ base::TimeTicks last_checkpoint_;
+ double cpu_percentage_;
+ bool is_enabled_;
+
+ std::unordered_set<TaskQueue*> associated_task_queues_;
+
+ base::Callback<void(base::TimeDelta)> reporting_callback_;
+
+ DISALLOW_COPY_AND_ASSIGN(CPUTimeBudgetPool);
+};
+
+} // namespace scheduler
+} // namespace blink
+
+#endif // THIRD_PARTY_WEBKIT_SOURCE_PLATFORM_SCHEDULER_RENDERER_BUDGET_POOL_H_
« no previous file with comments | « third_party/WebKit/Source/platform/BUILD.gn ('k') | third_party/WebKit/Source/platform/scheduler/renderer/budget_pool.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698