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

Unified Diff: cc/resources/task_graph_runner.h

Issue 943813002: cc: Add TaskGraphRunner sub-namespaces with task concurrency limits. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 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: cc/resources/task_graph_runner.h
diff --git a/cc/resources/task_graph_runner.h b/cc/resources/task_graph_runner.h
index 2ff085d76cb9fd5eac10414d2a7d6768c85acd86..204c169da494b6cc78c36824fda54d3c4c3ccef7 100644
--- a/cc/resources/task_graph_runner.h
+++ b/cc/resources/task_graph_runner.h
@@ -5,6 +5,7 @@
#ifndef CC_RESOURCES_TASK_GRAPH_RUNNER_H_
#define CC_RESOURCES_TASK_GRAPH_RUNNER_H_
+#include <array>
#include <map>
#include <vector>
@@ -53,12 +54,22 @@ struct CC_EXPORT TaskGraph {
typedef std::vector<Node> Vector;
- Node(Task* task, unsigned priority, size_t dependencies)
- : task(task), priority(priority), dependencies(dependencies) {}
+ Node(Task* task,
+ unsigned priority,
danakj 2015/02/23 18:45:01 did git cl format do this? it seems to have disabl
+ size_t dependencies,
+ int sub_namespace,
+ int max_concurrent_tasks)
+ : task(task),
+ priority(priority),
+ dependencies(dependencies),
+ sub_namespace(sub_namespace),
+ max_concurrent_tasks(max_concurrent_tasks) {}
Task* task;
unsigned priority;
size_t dependencies;
+ int sub_namespace;
+ int max_concurrent_tasks;
};
struct Edge {
@@ -141,26 +152,54 @@ class CC_EXPORT TaskGraphRunner {
struct PrioritizedTask {
typedef std::vector<PrioritizedTask> Vector;
- PrioritizedTask(Task* task, unsigned priority)
- : task(task), priority(priority) {}
+ PrioritizedTask(Task* task, unsigned priority, int max_concurrent_tasks)
+ : task(task),
+ priority(priority),
+ max_concurrent_tasks(max_concurrent_tasks) {}
Task* task;
unsigned priority;
+ int max_concurrent_tasks;
};
typedef std::vector<const Task*> TaskVector;
+ struct TaskNamespace;
+
+ struct TaskSubNamespace {
+ typedef std::vector<TaskSubNamespace*> Vector;
danakj 2015/02/23 18:45:01 prefer using instead of typedef
+
+ TaskSubNamespace();
+ ~TaskSubNamespace();
+ bool IsReadyToRun() const;
+
+ // Task namespace this belongs to.
+ TaskNamespace* task_namespace;
+
+ bool is_in_ready_sub_namespaces;
+
+ // Number of currently running tasks in this sub namespace.
+ int running_task_count;
+
+ // Ordered set of tasks that are ready to run.
+ PrioritizedTask::Vector ready_to_run_tasks;
+ };
+
struct TaskNamespace {
typedef std::vector<TaskNamespace*> Vector;
+ static const int kNumberOfSubNamespaces = 2;
danakj 2015/02/23 18:45:01 this 2 looks pretty magical here, is it possible t
+ static const int kDefaultSubNamespace = 0;
danakj 2015/02/23 18:45:01 There's at least 2 constants with this name in thi
+
TaskNamespace();
~TaskNamespace();
// Current task graph.
TaskGraph graph;
- // Ordered set of tasks that are ready to run.
- PrioritizedTask::Vector ready_to_run_tasks;
+ typedef std::array<TaskSubNamespace, kNumberOfSubNamespaces>
danakj 2015/02/23 18:45:01 std::array is c++11 library feature no? (ie can't
danakj 2015/02/23 18:45:01 using
+ SubNamespaceArray;
+ SubNamespaceArray sub_namespaces;
// Completed tasks not yet collected by origin thread.
Task::Vector completed_tasks;
@@ -177,8 +216,8 @@ class CC_EXPORT TaskGraphRunner {
return a.priority > b.priority;
}
- static bool CompareTaskNamespacePriority(const TaskNamespace* a,
- const TaskNamespace* b) {
+ static bool CompareTaskSubNamespacePriority(const TaskSubNamespace* a,
+ const TaskSubNamespace* b) {
DCHECK(!a->ready_to_run_tasks.empty());
DCHECK(!b->ready_to_run_tasks.empty());
@@ -191,8 +230,14 @@ class CC_EXPORT TaskGraphRunner {
static bool HasFinishedRunningTasksInNamespace(
const TaskNamespace* task_namespace) {
- return task_namespace->running_tasks.empty() &&
- task_namespace->ready_to_run_tasks.empty();
+ if (!task_namespace->running_tasks.empty())
+ return false;
+ for (const TaskSubNamespace& sub_namespace :
+ task_namespace->sub_namespaces) {
+ if (!sub_namespace.ready_to_run_tasks.empty())
+ return false;
+ }
+ return true;
}
// Run next task. Caller must acquire |lock_| prior to calling this function
@@ -218,8 +263,8 @@ class CC_EXPORT TaskGraphRunner {
// not yet collected.
TaskNamespaceMap namespaces_;
- // Ordered set of task namespaces that have ready to run tasks.
- TaskNamespace::Vector ready_to_run_namespaces_;
+ // Ordered set of task sub namespaces that have ready to run tasks.
+ TaskSubNamespace::Vector ready_to_run_sub_namespaces_;
// Set during shutdown. Tells Run() to return when no more tasks are pending.
bool shutdown_;

Powered by Google App Engine
This is Rietveld 408576698