xref: /aosp_15_r20/external/federated-compute/fcp/base/scheduler.h (revision 14675a029014e728ec732f129a32e299b2da0601)
1*14675a02SAndroid Build Coastguard Worker /*
2*14675a02SAndroid Build Coastguard Worker  * Copyright 2018 Google LLC
3*14675a02SAndroid Build Coastguard Worker  *
4*14675a02SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*14675a02SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*14675a02SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*14675a02SAndroid Build Coastguard Worker  *
8*14675a02SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*14675a02SAndroid Build Coastguard Worker  *
10*14675a02SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*14675a02SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*14675a02SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*14675a02SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*14675a02SAndroid Build Coastguard Worker  * limitations under the License.
15*14675a02SAndroid Build Coastguard Worker  */
16*14675a02SAndroid Build Coastguard Worker 
17*14675a02SAndroid Build Coastguard Worker #ifndef FCP_BASE_SCHEDULER_H_
18*14675a02SAndroid Build Coastguard Worker #define FCP_BASE_SCHEDULER_H_
19*14675a02SAndroid Build Coastguard Worker 
20*14675a02SAndroid Build Coastguard Worker /**
21*14675a02SAndroid Build Coastguard Worker  * Overview
22*14675a02SAndroid Build Coastguard Worker  * ========
23*14675a02SAndroid Build Coastguard Worker  *
24*14675a02SAndroid Build Coastguard Worker  * A simple implementation of a scheduler (thread pool). Allows to schedule
25*14675a02SAndroid Build Coastguard Worker  * tasks and futures.
26*14675a02SAndroid Build Coastguard Worker  */
27*14675a02SAndroid Build Coastguard Worker 
28*14675a02SAndroid Build Coastguard Worker #include <functional>
29*14675a02SAndroid Build Coastguard Worker #include <memory>
30*14675a02SAndroid Build Coastguard Worker 
31*14675a02SAndroid Build Coastguard Worker #include "fcp/base/monitoring.h"
32*14675a02SAndroid Build Coastguard Worker #include "fcp/base/move_to_lambda.h"
33*14675a02SAndroid Build Coastguard Worker 
34*14675a02SAndroid Build Coastguard Worker namespace fcp {
35*14675a02SAndroid Build Coastguard Worker 
36*14675a02SAndroid Build Coastguard Worker /**
37*14675a02SAndroid Build Coastguard Worker  * A Worker allows to schedule tasks which are executed sequentially.
38*14675a02SAndroid Build Coastguard Worker  * Workers are created from a Scheduler.
39*14675a02SAndroid Build Coastguard Worker  *
40*14675a02SAndroid Build Coastguard Worker  * Lifetime and destruction:
41*14675a02SAndroid Build Coastguard Worker  *
42*14675a02SAndroid Build Coastguard Worker  *   - The scheduler from which a worker is created must not be destructed
43*14675a02SAndroid Build Coastguard Worker  *     before the worker.
44*14675a02SAndroid Build Coastguard Worker  *
45*14675a02SAndroid Build Coastguard Worker  *   - The worker must not be destructed before all its tasks are finished.
46*14675a02SAndroid Build Coastguard Worker  */
47*14675a02SAndroid Build Coastguard Worker class Worker {
48*14675a02SAndroid Build Coastguard Worker  public:
49*14675a02SAndroid Build Coastguard Worker   virtual ~Worker() = default;
50*14675a02SAndroid Build Coastguard Worker   Worker() = default;
51*14675a02SAndroid Build Coastguard Worker 
52*14675a02SAndroid Build Coastguard Worker   Worker(Worker const&) = delete;
53*14675a02SAndroid Build Coastguard Worker   Worker& operator=(Worker const&) = delete;
54*14675a02SAndroid Build Coastguard Worker 
55*14675a02SAndroid Build Coastguard Worker   /**
56*14675a02SAndroid Build Coastguard Worker    * Schedules a task on this worker. Tasks are executed strictly sequentially
57*14675a02SAndroid Build Coastguard Worker    * in the order they are scheduled.
58*14675a02SAndroid Build Coastguard Worker    */
59*14675a02SAndroid Build Coastguard Worker   virtual void Schedule(std::function<void()> task) = 0;
60*14675a02SAndroid Build Coastguard Worker };
61*14675a02SAndroid Build Coastguard Worker 
62*14675a02SAndroid Build Coastguard Worker /**
63*14675a02SAndroid Build Coastguard Worker  * A Scheduler which allows to schedule 'tasks'.
64*14675a02SAndroid Build Coastguard Worker  *
65*14675a02SAndroid Build Coastguard Worker  * Lifetime and destruction:
66*14675a02SAndroid Build Coastguard Worker  *
67*14675a02SAndroid Build Coastguard Worker  *   - A Scheduler *must* be idle (no active or pending work) at destruction
68*14675a02SAndroid Build Coastguard Worker  *     time. See WaitUntilIdle.
69*14675a02SAndroid Build Coastguard Worker  *
70*14675a02SAndroid Build Coastguard Worker  *   - Implies: A Scheduler *must not* be destructed by one of its own tasks
71*14675a02SAndroid Build Coastguard Worker  *
72*14675a02SAndroid Build Coastguard Worker  *   - Implies: Task closures may safely hold raw pointers to their thread pool.
73*14675a02SAndroid Build Coastguard Worker  *     They should *not* have ownership (via a smart-pointer or similar).
74*14675a02SAndroid Build Coastguard Worker  */
75*14675a02SAndroid Build Coastguard Worker class Scheduler {
76*14675a02SAndroid Build Coastguard Worker  public:
77*14675a02SAndroid Build Coastguard Worker   virtual ~Scheduler() = default;
78*14675a02SAndroid Build Coastguard Worker   Scheduler() = default;
79*14675a02SAndroid Build Coastguard Worker 
80*14675a02SAndroid Build Coastguard Worker   Scheduler(Scheduler const&) = delete;
81*14675a02SAndroid Build Coastguard Worker   Scheduler& operator=(Scheduler const&) = delete;
82*14675a02SAndroid Build Coastguard Worker 
83*14675a02SAndroid Build Coastguard Worker   /**
84*14675a02SAndroid Build Coastguard Worker    * Creates a new Worker based on this scheduler.
85*14675a02SAndroid Build Coastguard Worker    */
86*14675a02SAndroid Build Coastguard Worker   virtual std::unique_ptr<Worker> CreateWorker();
87*14675a02SAndroid Build Coastguard Worker 
88*14675a02SAndroid Build Coastguard Worker   /**
89*14675a02SAndroid Build Coastguard Worker    * Schedules a task that will execute on the scheduler.
90*14675a02SAndroid Build Coastguard Worker    */
91*14675a02SAndroid Build Coastguard Worker   virtual void Schedule(std::function<void()> task) = 0;
92*14675a02SAndroid Build Coastguard Worker 
93*14675a02SAndroid Build Coastguard Worker   /**
94*14675a02SAndroid Build Coastguard Worker    * Waits until there are no tasks running or pending.
95*14675a02SAndroid Build Coastguard Worker    *
96*14675a02SAndroid Build Coastguard Worker    * In this state, the thread pool will not restart working until some
97*14675a02SAndroid Build Coastguard Worker    * external entity is scheduling new tasks, as work caused by tasks spawning
98*14675a02SAndroid Build Coastguard Worker    * other tasks has ceased.
99*14675a02SAndroid Build Coastguard Worker    */
100*14675a02SAndroid Build Coastguard Worker   virtual void WaitUntilIdle() = 0;
101*14675a02SAndroid Build Coastguard Worker };
102*14675a02SAndroid Build Coastguard Worker 
103*14675a02SAndroid Build Coastguard Worker /**
104*14675a02SAndroid Build Coastguard Worker  * Creates a scheduler using a fixed-size pool of threads to run tasks.
105*14675a02SAndroid Build Coastguard Worker  */
106*14675a02SAndroid Build Coastguard Worker std::unique_ptr<Scheduler> CreateThreadPoolScheduler(std::size_t thread_count);
107*14675a02SAndroid Build Coastguard Worker 
108*14675a02SAndroid Build Coastguard Worker }  // namespace fcp
109*14675a02SAndroid Build Coastguard Worker 
110*14675a02SAndroid Build Coastguard Worker #endif  // FCP_BASE_SCHEDULER_H_
111