[go: nahoru, domu]

blob: b4e06429a6de0e45c8b4598c27280590c92cc381 [file] [log] [blame]
// Copyright 2019 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 CONTENT_BROWSER_SCHEDULER_BROWSER_UI_THREAD_SCHEDULER_H_
#define CONTENT_BROWSER_SCHEDULER_BROWSER_UI_THREAD_SCHEDULER_H_
#include <memory>
#include "base/task/sequence_manager/task_queue.h"
#include "base/time/time.h"
#include "content/browser/scheduler/browser_task_queues.h"
#include "content/common/content_export.h"
namespace base {
namespace sequence_manager {
class SequenceManager;
} // namespace sequence_manager
} // namespace base
namespace content {
class BrowserTaskExecutor;
// The BrowserUIThreadScheduler vends TaskQueues and manipulates them to
// implement scheduling policy. This class is never deleted in production.
class CONTENT_EXPORT BrowserUIThreadScheduler {
public:
class UserInputActiveHandle {
public:
explicit UserInputActiveHandle(BrowserUIThreadScheduler* scheduler);
~UserInputActiveHandle();
// This is a move only type.
UserInputActiveHandle(const UserInputActiveHandle&) = delete;
UserInputActiveHandle& operator=(const UserInputActiveHandle&) = delete;
UserInputActiveHandle& operator=(UserInputActiveHandle&&);
UserInputActiveHandle(UserInputActiveHandle&& other);
private:
void MoveFrom(UserInputActiveHandle* other);
// Only this constructor actually creates a UserInputActiveHandle that will
// inform scheduling decisions.
BrowserUIThreadScheduler* scheduler_ = nullptr;
};
using Handle = BrowserTaskQueues::Handle;
BrowserUIThreadScheduler();
BrowserUIThreadScheduler(const BrowserUIThreadScheduler&) = delete;
BrowserUIThreadScheduler& operator=(const BrowserUIThreadScheduler&) = delete;
~BrowserUIThreadScheduler();
// Setting the DefaultTaskRunner is up to the caller.
static std::unique_ptr<BrowserUIThreadScheduler> CreateForTesting(
base::sequence_manager::SequenceManager* sequence_manager);
using QueueType = BrowserTaskQueues::QueueType;
scoped_refptr<Handle> GetHandle() const { return handle_; }
private:
friend class BrowserTaskExecutor;
explicit BrowserUIThreadScheduler(
base::sequence_manager::SequenceManager* sequence_manager);
void CommonSequenceManagerSetup(
base::sequence_manager::SequenceManager* sequence_manager);
// Called after the feature list is ready and we can set up any policy
// experiments.
void PostFeatureListSetup();
// Used in the BrowserPrioritizeNativeWork experiment, when we want to
// prioritize yielding to java when user input starts and for a short period
// after it ends.
BrowserUIThreadScheduler::UserInputActiveHandle OnUserInputStart();
void DidStartUserInput();
void DidEndUserInput();
// After user input has ended CancelNativePriority will be called to inform
// the SequenceManager to stop prioritizing yielding to native tasks.
void CancelNativePriority();
// In production the BrowserUIThreadScheduler will own its SequenceManager,
// but in tests it may not.
std::unique_ptr<base::sequence_manager::SequenceManager>
owned_sequence_manager_;
BrowserTaskQueues task_queues_;
scoped_refptr<Handle> handle_;
// These four variables are used in the BrowserPrioritizeNativeWork finch
// experiment. False ensures this feature is disabled by default.
int user_input_active_handle_count = 0;
bool browser_prioritize_native_work_ = false;
base::TimeDelta browser_prioritize_native_work_after_input_end_ms_;
};
} // namespace content
#endif // CONTENT_BROWSER_SCHEDULER_BROWSER_UI_THREAD_SCHEDULER_H_