Commit 6dbe9498 authored by Carlos Caballero's avatar Carlos Caballero Committed by Commit Bot

Add tasks traits for BrowserUIThreadScheduler

Add a new task trait to tell the future BrowserUIThreadScheduler which
tasks are critical for startup and allow it to prioritize them
accordingly.

Design doc: https://docs.google.com/document/d/1z1BDq9vzcEpkhN9LSPF5XMnZ0kLJ8mWWkNAi4OI7cos/edit#

Bug: 863341, 872372
Change-Id: Ifb082762726fbda951325802faf82f1dacf219cc
Reviewed-on: https://chromium-review.googlesource.com/c/1454632
Commit-Queue: Carlos Caballero <carlscab@google.com>
Reviewed-by: default avatarJochen Eisinger <jochen@chromium.org>
Reviewed-by: default avatarAlex Clarke <alexclarke@chromium.org>
Reviewed-by: default avatarSami Kyöstilä <skyostil@chromium.org>
Cr-Commit-Position: refs/heads/master@{#629944}
parent 2b0cad55
......@@ -355,6 +355,7 @@ java_cpp_enum("content_public_android_java_enums_srcjar") {
"//content/browser/android/select_popup.cc",
"//content/public/browser/android/child_process_importance.h",
"//content/public/browser/android/motion_event_action.h",
"//content/public/browser/browser_task_traits.h",
"//content/public/browser/browsing_data_remover.h",
"//content/public/browser/invalidate_type.h",
"//content/public/browser/navigation_controller.h",
......
......@@ -7,6 +7,7 @@ package org.chromium.content.browser;
import org.chromium.base.task.TaskPriority;
import org.chromium.base.task.TaskTraits;
import org.chromium.content_public.browser.BrowserTaskExecutor;
import org.chromium.content_public.browser.BrowserTaskType;
/**
* Provides the implementation needed in UiThreadTaskTraits.
......@@ -18,11 +19,14 @@ public class UiThreadTaskTraitsImpl {
public static final byte EXTENSION_ID = 1;
// Keep in sync with content::BrowserTaskTraitsExtension::Serialize.
private static final byte NESTING_INDEX = 1;
private static final byte TASK_TYPE = 1;
private static final byte NESTING_INDEX = 2;
private static final byte[] sDefaultExtensionData = getDefaultExtesionData();
private static final byte[] sDefaultExtensionData = getDefaultExtensionData();
public static final TaskTraits DEFAULT = new TaskTraits(EXTENSION_ID, sDefaultExtensionData);
public static final TaskTraits BOOTSTRAP = new TaskTraits(
EXTENSION_ID, getExtensionDataForBrowserTaskType(BrowserTaskType.BOOTSTRAP));
public static final TaskTraits BEST_EFFORT = DEFAULT.taskPriority(TaskPriority.BEST_EFFORT);
public static final TaskTraits USER_VISIBLE = DEFAULT.taskPriority(TaskPriority.USER_VISIBLE);
public static final TaskTraits USER_BLOCKING = DEFAULT.taskPriority(TaskPriority.USER_BLOCKING);
......@@ -31,14 +35,22 @@ public class UiThreadTaskTraitsImpl {
BrowserTaskExecutor.register();
}
private static byte[] getDefaultExtesionData() {
private static byte[] getDefaultExtensionData() {
byte extensionData[] = new byte[TaskTraits.EXTENSION_STORAGE_SIZE];
// Note we don't specify the UI thread directly here because it's ID 0 and the array is
// initialized to zero.
// Similarly we don't specify BrowserTaskType.Default its ID is also 0.
// TODO(crbug.com/876272) Remove this if possible.
extensionData[NESTING_INDEX] = 1; // Allow the task to run in a nested RunLoop.
return extensionData;
}
private static byte[] getExtensionDataForBrowserTaskType(int browserTaskType) {
byte extensionData[] = getDefaultExtensionData();
extensionData[TASK_TYPE] = (byte) browserTaskType;
return extensionData;
}
}
......@@ -22,4 +22,5 @@ public class UiThreadTaskTraits {
public static final TaskTraits BEST_EFFORT = UiThreadTaskTraitsImpl.BEST_EFFORT;
public static final TaskTraits USER_VISIBLE = UiThreadTaskTraitsImpl.USER_VISIBLE;
public static final TaskTraits USER_BLOCKING = UiThreadTaskTraitsImpl.USER_BLOCKING;
public static final TaskTraits BOOTSTRAP = UiThreadTaskTraitsImpl.BOOTSTRAP;
}
......@@ -21,6 +21,21 @@ namespace content {
// logic for deferred tasks in MessageLoop.
struct NonNestable {};
// Semantic annotations which tell the scheduler what type of task it's dealing
// with. This will be used by the scheduler for dynamic prioritization and for
// attribution in traces, etc...
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.content_public.browser
enum class BrowserTaskType {
// A catch all tasks that don't fit the types below.
kDefault,
// Critical startup tasks.
kBootstrap,
// Used to validate values in Java
kBrowserTaskType_Last
};
// TaskTraits for running tasks on the browser threads.
//
// These traits enable the use of the //base/task/post_task.h APIs to post tasks
......@@ -49,6 +64,7 @@ class CONTENT_EXPORT BrowserTaskTraitsExtension {
using base::TaskTraits::ValidTrait::ValidTrait;
ValidTrait(BrowserThread::ID);
ValidTrait(BrowserTaskType);
ValidTrait(NonNestable);
};
......@@ -59,35 +75,46 @@ class CONTENT_EXPORT BrowserTaskTraitsExtension {
constexpr BrowserTaskTraitsExtension(ArgTypes... args)
: browser_thread_(
base::trait_helpers::GetEnum<BrowserThread::ID>(args...)),
task_type_(
base::trait_helpers::GetEnum<BrowserTaskType,
BrowserTaskType::kDefault>(args...)),
nestable_(!base::trait_helpers::HasTrait<NonNestable>(args...)) {}
// Keep in sync with UiThreadTaskTraits.java
constexpr base::TaskTraitsExtensionStorage Serialize() const {
static_assert(8 == sizeof(BrowserTaskTraitsExtension),
static_assert(12 == sizeof(BrowserTaskTraitsExtension),
"Update Serialize() and Parse() when changing "
"BrowserTaskTraitsExtension");
return {kExtensionId,
{static_cast<uint8_t>(browser_thread_),
static_cast<uint8_t>(nestable_)}};
return {
kExtensionId,
{static_cast<uint8_t>(browser_thread_),
static_cast<uint8_t>(task_type_), static_cast<uint8_t>(nestable_)}};
}
static const BrowserTaskTraitsExtension Parse(
const base::TaskTraitsExtensionStorage& extension) {
return BrowserTaskTraitsExtension(
static_cast<BrowserThread::ID>(extension.data[0]),
static_cast<bool>(extension.data[1]));
static_cast<BrowserTaskType>(extension.data[1]),
static_cast<bool>(extension.data[2]));
}
constexpr BrowserThread::ID browser_thread() const { return browser_thread_; }
constexpr BrowserTaskType task_type() const { return task_type_; }
// Returns true if tasks with these traits may run in a nested RunLoop.
constexpr bool nestable() const { return nestable_; }
private:
BrowserTaskTraitsExtension(BrowserThread::ID browser_thread, bool nestable)
: browser_thread_(browser_thread), nestable_(nestable) {}
BrowserTaskTraitsExtension(BrowserThread::ID browser_thread,
BrowserTaskType task_type,
bool nestable)
: browser_thread_(browser_thread),
task_type_(task_type),
nestable_(nestable) {}
BrowserThread::ID browser_thread_;
BrowserTaskType task_type_;
bool nestable_;
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment