Index: components/policy/core/common/policy_scheduler.h |
diff --git a/components/policy/core/common/policy_scheduler.h b/components/policy/core/common/policy_scheduler.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a5701439cfd1e08efb8ec52129f0230191417839 |
--- /dev/null |
+++ b/components/policy/core/common/policy_scheduler.h |
@@ -0,0 +1,95 @@ |
+// Copyright 2017 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_POLICY_CORE_COMMON_POLICY_SCHEDULER_H_ |
+#define COMPONENTS_POLICY_CORE_COMMON_POLICY_SCHEDULER_H_ |
+ |
+#include <memory> |
+ |
+#include "base/callback.h" |
+#include "base/cancelable_callback.h" |
+#include "base/macros.h" |
+#include "base/memory/weak_ptr.h" |
+#include "base/sequence_checker.h" |
+#include "base/time/time.h" |
+#include "components/policy/policy_export.h" |
+ |
+namespace policy { |
+ |
+// Scheduler for driving repeated asynchronous tasks such as e.g. policy |
+// fetches. Subsequent tasks are guaranteed not to overlap. Tasks are posted to |
+// the current thread and therefore must not block (suitable e.g. for |
+// asynchronous D-Bus calls). |
+// Tasks scheduling begins immediately after instantiation of the class. Upon |
+// destruction, scheduled but not yet started tasks are cancelled. The result of |
+// started but not finished tasks is NOT reported. |
+class POLICY_EXPORT PolicyScheduler { |
+ public: |
+ // Callback for the task to report success or failure. |
+ using TaskCallback = base::OnceCallback<void(bool success)>; |
+ |
+ // Task to be performed at regular intervals. The task takes a |callback| to |
+ // return success or failure. |
+ using Task = base::RepeatingCallback<void(TaskCallback callback)>; |
+ |
+ // Callback for PolicyScheduler to report success or failure of the tasks. |
+ using SchedulerCallback = base::RepeatingCallback<void(bool success)>; |
+ |
+ // Defines the |task| to be run every |interval| and the |callback| for the |
+ // scheduler to report the result. (Intervals are computed as the time |
+ // difference between the end of the previous and the start of the subsequent |
+ // task.) Calling the constructor starts the loop and schedules the first task |
+ // to be run without delay. |
+ PolicyScheduler(Task task, |
+ SchedulerCallback callback, |
+ base::TimeDelta interval); |
+ ~PolicyScheduler(); |
+ |
+ // Schedules a task to run immediately. Deletes any previously scheduled but |
+ // not yet started tasks. In case a task is running currently, the new task is |
+ // scheduled to run immediately after the end of the currently running task. |
+ void ScheduleTaskNow(); |
+ |
+ private: |
+ // Schedules next task to run in |delay|. Deletes any previously scheduled |
+ // tasks. |
+ void ScheduleDelayedTask(base::TimeDelta delay); |
+ |
+ // Schedules next task to run in |interval_| or immediately in case of |
+ // overlap. Deletes any previously scheduled tasks. |
+ void ScheduleNextTask(); |
+ |
+ // Actually executes the scheduled task. |
+ void RunScheduledTask(); |
+ |
+ // Reports back the |result| of the previous task and schedules the next one. |
+ void OnTaskDone(bool result); |
+ |
+ Task task_; |
+ SchedulerCallback callback_; |
+ const base::TimeDelta interval_; |
+ |
+ // Whether a task is in progress. |
+ bool task_in_progress_ = false; |
+ |
+ // Whether there had been an overlap of tasks and thus the next task needs to |
+ // be scheduled without delay. |
+ bool overlap_ = false; |
+ |
+ // End time of the previous task. Zero in case no task has ended yet. |
+ base::TimeTicks last_task_; |
+ |
+ std::unique_ptr<base::CancelableClosure> job_; |
+ |
+ SEQUENCE_CHECKER(sequence_checker_); |
+ |
+ // Must be last member. |
+ base::WeakPtrFactory<PolicyScheduler> weak_ptr_factory_{this}; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PolicyScheduler); |
+}; |
+ |
+} // namespace policy |
+ |
+#endif // COMPONENTS_POLICY_CORE_COMMON_POLICY_SCHEDULER_H_ |