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") { ...@@ -355,6 +355,7 @@ java_cpp_enum("content_public_android_java_enums_srcjar") {
"//content/browser/android/select_popup.cc", "//content/browser/android/select_popup.cc",
"//content/public/browser/android/child_process_importance.h", "//content/public/browser/android/child_process_importance.h",
"//content/public/browser/android/motion_event_action.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/browsing_data_remover.h",
"//content/public/browser/invalidate_type.h", "//content/public/browser/invalidate_type.h",
"//content/public/browser/navigation_controller.h", "//content/public/browser/navigation_controller.h",
......
...@@ -7,6 +7,7 @@ package org.chromium.content.browser; ...@@ -7,6 +7,7 @@ package org.chromium.content.browser;
import org.chromium.base.task.TaskPriority; import org.chromium.base.task.TaskPriority;
import org.chromium.base.task.TaskTraits; import org.chromium.base.task.TaskTraits;
import org.chromium.content_public.browser.BrowserTaskExecutor; import org.chromium.content_public.browser.BrowserTaskExecutor;
import org.chromium.content_public.browser.BrowserTaskType;
/** /**
* Provides the implementation needed in UiThreadTaskTraits. * Provides the implementation needed in UiThreadTaskTraits.
...@@ -18,11 +19,14 @@ public class UiThreadTaskTraitsImpl { ...@@ -18,11 +19,14 @@ public class UiThreadTaskTraitsImpl {
public static final byte EXTENSION_ID = 1; public static final byte EXTENSION_ID = 1;
// Keep in sync with content::BrowserTaskTraitsExtension::Serialize. // 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 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 BEST_EFFORT = DEFAULT.taskPriority(TaskPriority.BEST_EFFORT);
public static final TaskTraits USER_VISIBLE = DEFAULT.taskPriority(TaskPriority.USER_VISIBLE); public static final TaskTraits USER_VISIBLE = DEFAULT.taskPriority(TaskPriority.USER_VISIBLE);
public static final TaskTraits USER_BLOCKING = DEFAULT.taskPriority(TaskPriority.USER_BLOCKING); public static final TaskTraits USER_BLOCKING = DEFAULT.taskPriority(TaskPriority.USER_BLOCKING);
...@@ -31,14 +35,22 @@ public class UiThreadTaskTraitsImpl { ...@@ -31,14 +35,22 @@ public class UiThreadTaskTraitsImpl {
BrowserTaskExecutor.register(); BrowserTaskExecutor.register();
} }
private static byte[] getDefaultExtesionData() { private static byte[] getDefaultExtensionData() {
byte extensionData[] = new byte[TaskTraits.EXTENSION_STORAGE_SIZE]; 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 // Note we don't specify the UI thread directly here because it's ID 0 and the array is
// initialized to zero. // initialized to zero.
// Similarly we don't specify BrowserTaskType.Default its ID is also 0.
// TODO(crbug.com/876272) Remove this if possible. // TODO(crbug.com/876272) Remove this if possible.
extensionData[NESTING_INDEX] = 1; // Allow the task to run in a nested RunLoop. extensionData[NESTING_INDEX] = 1; // Allow the task to run in a nested RunLoop.
return extensionData; 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 { ...@@ -22,4 +22,5 @@ public class UiThreadTaskTraits {
public static final TaskTraits BEST_EFFORT = UiThreadTaskTraitsImpl.BEST_EFFORT; public static final TaskTraits BEST_EFFORT = UiThreadTaskTraitsImpl.BEST_EFFORT;
public static final TaskTraits USER_VISIBLE = UiThreadTaskTraitsImpl.USER_VISIBLE; public static final TaskTraits USER_VISIBLE = UiThreadTaskTraitsImpl.USER_VISIBLE;
public static final TaskTraits USER_BLOCKING = UiThreadTaskTraitsImpl.USER_BLOCKING; public static final TaskTraits USER_BLOCKING = UiThreadTaskTraitsImpl.USER_BLOCKING;
public static final TaskTraits BOOTSTRAP = UiThreadTaskTraitsImpl.BOOTSTRAP;
} }
...@@ -21,6 +21,21 @@ namespace content { ...@@ -21,6 +21,21 @@ namespace content {
// logic for deferred tasks in MessageLoop. // logic for deferred tasks in MessageLoop.
struct NonNestable {}; 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. // TaskTraits for running tasks on the browser threads.
// //
// These traits enable the use of the //base/task/post_task.h APIs to post tasks // These traits enable the use of the //base/task/post_task.h APIs to post tasks
...@@ -49,6 +64,7 @@ class CONTENT_EXPORT BrowserTaskTraitsExtension { ...@@ -49,6 +64,7 @@ class CONTENT_EXPORT BrowserTaskTraitsExtension {
using base::TaskTraits::ValidTrait::ValidTrait; using base::TaskTraits::ValidTrait::ValidTrait;
ValidTrait(BrowserThread::ID); ValidTrait(BrowserThread::ID);
ValidTrait(BrowserTaskType);
ValidTrait(NonNestable); ValidTrait(NonNestable);
}; };
...@@ -59,35 +75,46 @@ class CONTENT_EXPORT BrowserTaskTraitsExtension { ...@@ -59,35 +75,46 @@ class CONTENT_EXPORT BrowserTaskTraitsExtension {
constexpr BrowserTaskTraitsExtension(ArgTypes... args) constexpr BrowserTaskTraitsExtension(ArgTypes... args)
: browser_thread_( : browser_thread_(
base::trait_helpers::GetEnum<BrowserThread::ID>(args...)), base::trait_helpers::GetEnum<BrowserThread::ID>(args...)),
task_type_(
base::trait_helpers::GetEnum<BrowserTaskType,
BrowserTaskType::kDefault>(args...)),
nestable_(!base::trait_helpers::HasTrait<NonNestable>(args...)) {} nestable_(!base::trait_helpers::HasTrait<NonNestable>(args...)) {}
// Keep in sync with UiThreadTaskTraits.java // Keep in sync with UiThreadTaskTraits.java
constexpr base::TaskTraitsExtensionStorage Serialize() const { constexpr base::TaskTraitsExtensionStorage Serialize() const {
static_assert(8 == sizeof(BrowserTaskTraitsExtension), static_assert(12 == sizeof(BrowserTaskTraitsExtension),
"Update Serialize() and Parse() when changing " "Update Serialize() and Parse() when changing "
"BrowserTaskTraitsExtension"); "BrowserTaskTraitsExtension");
return {kExtensionId, return {
{static_cast<uint8_t>(browser_thread_), kExtensionId,
static_cast<uint8_t>(nestable_)}}; {static_cast<uint8_t>(browser_thread_),
static_cast<uint8_t>(task_type_), static_cast<uint8_t>(nestable_)}};
} }
static const BrowserTaskTraitsExtension Parse( static const BrowserTaskTraitsExtension Parse(
const base::TaskTraitsExtensionStorage& extension) { const base::TaskTraitsExtensionStorage& extension) {
return BrowserTaskTraitsExtension( return BrowserTaskTraitsExtension(
static_cast<BrowserThread::ID>(extension.data[0]), 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 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. // Returns true if tasks with these traits may run in a nested RunLoop.
constexpr bool nestable() const { return nestable_; } constexpr bool nestable() const { return nestable_; }
private: private:
BrowserTaskTraitsExtension(BrowserThread::ID browser_thread, bool nestable) BrowserTaskTraitsExtension(BrowserThread::ID browser_thread,
: browser_thread_(browser_thread), nestable_(nestable) {} BrowserTaskType task_type,
bool nestable)
: browser_thread_(browser_thread),
task_type_(task_type),
nestable_(nestable) {}
BrowserThread::ID browser_thread_; BrowserThread::ID browser_thread_;
BrowserTaskType task_type_;
bool nestable_; 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