blob: 7add339b4d5205b698bdc6daafe99867450e858c [file] [log] [blame]
// 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_BLINK_RENDERER_PLATFORM_SCHEDULER_COMMON_THROTTLING_BUDGET_POOL_H_
#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_COMMON_THROTTLING_BUDGET_POOL_H_
#include "base/callback.h"
#include "base/macros.h"
#include "base/optional.h"
#include "base/task/sequence_manager/lazy_now.h"
#include "base/task/sequence_manager/task_queue.h"
#include "base/time/time.h"
#include "third_party/blink/renderer/platform/platform_export.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "third_party/blink/renderer/platform/wtf/hash_set.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"
namespace base {
namespace sequence_manager {
class TaskQueue;
}
namespace trace_event {
class TracedValue;
}
} // namespace base
namespace blink {
namespace scheduler {
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
// by TaskQueueThrottler.
class PLATFORM_EXPORT BudgetPool {
USING_FAST_MALLOC(BudgetPool);
public:
virtual ~BudgetPool();
const char* Name() const;
// Report task run time to the budget pool.
virtual void RecordTaskRunTime(base::sequence_manager::TaskQueue* queue,
base::TimeTicks start_time,
base::TimeTicks end_time) = 0;
// Returns the earliest time when the next pump can be scheduled to run
// new tasks.
virtual base::TimeTicks GetNextAllowedRunTime(
base::TimeTicks desired_run_time) const = 0;
// Returns true if a task can run at the given time.
virtual bool CanRunTasksAt(base::TimeTicks moment, bool is_wake_up) const = 0;
// Returns a point in time until which tasks are allowed to run.
// base::TimeTicks::Max() means that there are no known limits.
virtual base::TimeTicks GetTimeTasksCanRunUntil(base::TimeTicks now,
bool is_wake_up) const = 0;
// Notifies budget pool that queue has work with desired run time.
virtual void OnQueueNextWakeUpChanged(
base::sequence_manager::TaskQueue* queue,
base::TimeTicks now,
base::TimeTicks desired_run_time) = 0;
// Invoked as part of a global wake up if any of the task queues associated
// with the budget pool has reached its next allowed run time. The next
// allowed run time of a queue is the maximum value returned from
// GetNextAllowedRunTime() among all the budget pools it is part of.
virtual void OnWakeUp(base::TimeTicks now) = 0;
// Specify how this budget pool should block affected queues.
virtual QueueBlockType GetBlockType() const = 0;
// Records state for tracing.
virtual void WriteIntoTracedValue(perfetto::TracedValue context,
base::TimeTicks now) 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.
void AddQueue(base::TimeTicks now, base::sequence_manager::TaskQueue* queue);
// Removes |queue| from given pool. If it is throttled, it does not
// become enabled immediately, but a wake-up is scheduled if needed.
void RemoveQueue(base::TimeTicks now,
base::sequence_manager::TaskQueue* queue);
// Unlike RemoveQueue, does not schedule a new wake-up for the queue.
void UnregisterQueue(base::sequence_manager::TaskQueue* queue);
// Enables this time budget pool. Queues from this pool will be
// throttled based on their run time.
void EnableThrottling(base::sequence_manager::LazyNow* now);
// 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.
void DisableThrottling(base::sequence_manager::LazyNow* now);
bool IsThrottlingEnabled() const;
// All queues should be removed before calling Close().
void Close();
// Ensures that a pump is scheduled and that a fence is installed for all
// queues in this pool, based on state of those queues and latest values from
// CanRunTasksAt/GetTimeTasksCanRunUntil/GetNextAllowedRunTime.
void UpdateThrottlingStateForAllQueues(base::TimeTicks now);
protected:
BudgetPool(const char* name, BudgetPoolController* budget_pool_controller);
const char* name_; // NOT OWNED
BudgetPoolController* budget_pool_controller_;
HashSet<base::sequence_manager::TaskQueue*> associated_task_queues_;
bool is_enabled_;
private:
void DissociateQueue(base::sequence_manager::TaskQueue* queue);
};
} // namespace scheduler
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_SCHEDULER_COMMON_THROTTLING_BUDGET_POOL_H_