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