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

Unified Diff: components/scheduler/child/task_queue.h

Issue 1370343002: Revert of scheduler: Add a base directory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 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: components/scheduler/child/task_queue.h
diff --git a/components/scheduler/child/task_queue.h b/components/scheduler/child/task_queue.h
new file mode 100644
index 0000000000000000000000000000000000000000..e4ce9ee50e78a875ad183c0091d4d5dfe051a436
--- /dev/null
+++ b/components/scheduler/child/task_queue.h
@@ -0,0 +1,184 @@
+// Copyright 2015 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 COMPONENTS_SCHEDULER_CHILD_TASK_QUEUE_H_
+#define COMPONENTS_SCHEDULER_CHILD_TASK_QUEUE_H_
+
+#include "base/message_loop/message_loop.h"
+#include "base/single_thread_task_runner.h"
+#include "components/scheduler/scheduler_export.h"
+
+namespace scheduler {
+
+class SCHEDULER_EXPORT TaskQueue : public base::SingleThreadTaskRunner {
+ public:
+ TaskQueue() {}
+
+ // Unregisters the task queue after which no tasks posted to it will run and
+ // the TaskQueueManager's reference to it will be released soon.
+ virtual void UnregisterTaskQueue() = 0;
+
+ // Post a delayed task at an absolute desired run time instead of a time
+ // delta from the current time.
+ virtual bool PostDelayedTaskAt(const tracked_objects::Location& from_here,
+ const base::Closure& task,
+ base::TimeTicks desired_run_time) = 0;
+
+ enum QueuePriority {
+ // Queues with control priority will run before any other queue, and will
+ // explicitly starve other queues. Typically this should only be used for
+ // private queues which perform control operations.
+ CONTROL_PRIORITY,
+ // Queues with high priority will be selected preferentially over normal or
+ // best effort queues. The selector will ensure that high priority queues
+ // cannot completely starve normal priority queues.
+ HIGH_PRIORITY,
+ // Queues with normal priority are the default.
+ NORMAL_PRIORITY,
+ // Queues with best effort priority will only be run if all other queues are
+ // empty. They can be starved by the other queues.
+ BEST_EFFORT_PRIORITY,
+ // Queues with this priority are never run. Must be penultimate entry.
+ DISABLED_PRIORITY,
+ // Must be the last entry.
+ QUEUE_PRIORITY_COUNT,
+ FIRST_QUEUE_PRIORITY = CONTROL_PRIORITY,
+ };
+
+ // Keep TaskQueue::PumpPolicyToString in sync with this enum.
+ enum class PumpPolicy {
+ // Tasks posted to an incoming queue with an AUTO pump policy will be
+ // automatically scheduled for execution or transferred to the work queue
+ // automatically.
+ AUTO,
+ // Tasks posted to an incoming queue with an AFTER_WAKEUP pump policy
+ // will be scheduled for execution or transferred to the work queue
+ // automatically but only after another queue has executed a task.
+ AFTER_WAKEUP,
+ // Tasks posted to an incoming queue with a MANUAL will not be
+ // automatically scheduled for execution or transferred to the work queue.
+ // Instead, the selector should call PumpQueue() when necessary to bring
+ // in new tasks for execution.
+ MANUAL,
+ // Must be last entry.
+ PUMP_POLICY_COUNT,
+ FIRST_PUMP_POLICY = AUTO,
+ };
+
+ // Keep TaskQueue::WakeupPolicyToString in sync with this enum.
+ enum class WakeupPolicy {
+ // Tasks run on a queue with CAN_WAKE_OTHER_QUEUES wakeup policy can
+ // cause queues with the AFTER_WAKEUP PumpPolicy to be woken up.
+ CAN_WAKE_OTHER_QUEUES,
+ // Tasks run on a queue with DONT_WAKE_OTHER_QUEUES won't cause queues
+ // with the AFTER_WAKEUP PumpPolicy to be woken up.
+ DONT_WAKE_OTHER_QUEUES,
+ // Must be last entry.
+ WAKEUP_POLICY_COUNT,
+ FIRST_WAKEUP_POLICY = CAN_WAKE_OTHER_QUEUES,
+ };
+
+ enum class QueueState {
+ // A queue in the EMPTY state is empty and has no tasks in either the
+ // work or incoming task queue.
+ EMPTY,
+ // A queue in the NEEDS_PUMPING state has no tasks in the work task queue,
+ // but has tasks in the incoming task queue which can be pumped to make them
+ // runnable.
+ NEEDS_PUMPING,
+ // A queue in the HAS_WORK state has tasks in the work task queue which
+ // are runnable.
+ HAS_WORK,
+ };
+
+ // Options for constructing a TaskQueue. Once set the |name|,
+ // |should_monitor_quiescence| and |wakeup_policy| are immutable. The
+ // |pump_policy| can be mutated with |SetPumpPolicy()|.
+ struct Spec {
+ // Note |name| must have application lifetime.
+ explicit Spec(const char* name)
+ : name(name),
+ should_monitor_quiescence(false),
+ pump_policy(TaskQueue::PumpPolicy::AUTO),
+ wakeup_policy(TaskQueue::WakeupPolicy::CAN_WAKE_OTHER_QUEUES),
+ should_notify_observers(true) {}
+
+ Spec SetShouldMonitorQuiescence(bool should_monitor) {
+ should_monitor_quiescence = should_monitor;
+ return *this;
+ }
+
+ Spec SetPumpPolicy(PumpPolicy policy) {
+ pump_policy = policy;
+ return *this;
+ }
+
+ Spec SetWakeupPolicy(WakeupPolicy policy) {
+ wakeup_policy = policy;
+ return *this;
+ }
+
+ Spec SetShouldNotifyObservers(bool run_observers) {
+ should_notify_observers = run_observers;
+ return *this;
+ }
+
+ const char* name;
+ bool should_monitor_quiescence;
+ TaskQueue::PumpPolicy pump_policy;
+ TaskQueue::WakeupPolicy wakeup_policy;
+ bool should_notify_observers;
+ };
+
+ // Returns true if the queue priority is not
+ // TaskQueueSelector::DISABLED_PRIORITY. NOTE this must be called on the
+ // thread this TaskQueue was created by.
+ virtual bool IsQueueEnabled() const = 0;
+
+ // Returns true if there no tasks in either the work or incoming task queue.
+ // Note that this function involves taking a lock, so calling it has some
+ // overhead. NOTE this must be called on the thread this TaskQueue was created
+ // by.
+ virtual bool IsQueueEmpty() const;
+
+ // Returns the QueueState. Note that this function involves taking a lock, so
+ // calling it has some overhead.
+ virtual QueueState GetQueueState() const = 0;
+
+ // Can be called on any thread.
+ virtual const char* GetName() const = 0;
+
+ // Set the priority of the queue to |priority|. NOTE this must be called on
+ // the thread this TaskQueue was created by.
+ virtual void SetQueuePriority(QueuePriority priority) = 0;
+
+ // Set the pumping policy of the queue to |pump_policy|. NOTE this must be
+ // called on the thread this TaskQueue was created by.
+ virtual void SetPumpPolicy(PumpPolicy pump_policy) = 0;
+
+ // Reloads new tasks from the incoming queue into the work queue, regardless
+ // of whether the work queue is empty or not. After this, the function ensures
+ // that the tasks in the work queue, if any, are scheduled for execution.
+ //
+ // This function only needs to be called if automatic pumping is disabled.
+ // By default automatic pumping is enabled for all queues. NOTE this must be
+ // called on the thread this TaskQueue was created by.
+ virtual void PumpQueue() = 0;
+
+ // These functions can only be called on the same thread that the task queue
+ // manager executes its tasks on.
+ virtual void AddTaskObserver(
+ base::MessageLoop::TaskObserver* task_observer) = 0;
+ virtual void RemoveTaskObserver(
+ base::MessageLoop::TaskObserver* task_observer) = 0;
+
+ protected:
+ ~TaskQueue() override {}
+
+ DISALLOW_COPY_AND_ASSIGN(TaskQueue);
+};
+
+} // namespace scheduler
+
+#endif // COMPONENTS_SCHEDULER_CHILD_TASK_QUEUE_H_
« no previous file with comments | « components/scheduler/child/scheduler_task_runner_delegate_for_test.cc ('k') | components/scheduler/child/task_queue.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698