/* * Copyright (c) Facebook, Inc. and its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include namespace folly { struct FOLLY_EXPORT TimekeeperScheduledExecutorNoTimekeeper : public std::logic_error { TimekeeperScheduledExecutorNoTimekeeper() : std::logic_error("No Timekeeper available") {} }; // This class turns a Executor into a ScheduledExecutor. class TimekeeperScheduledExecutor : public ScheduledExecutor { public: TimekeeperScheduledExecutor(TimekeeperScheduledExecutor const&) = delete; TimekeeperScheduledExecutor& operator=(TimekeeperScheduledExecutor const&) = delete; TimekeeperScheduledExecutor(TimekeeperScheduledExecutor&&) = delete; TimekeeperScheduledExecutor& operator=(TimekeeperScheduledExecutor&&) = delete; static Executor::KeepAlive create( Executor::KeepAlive<> parent, Function()> getTimekeeper = detail::getTimekeeperSingleton); virtual void add(Func func) override; virtual void scheduleAt(Func&& func, ScheduledExecutor::TimePoint const& t) override; protected: bool keepAliveAcquire() override; void keepAliveRelease() override; private: TimekeeperScheduledExecutor( KeepAlive&& parent, Function()> getTimekeeper) : parent_(std::move(parent)), getTimekeeper_(std::move(getTimekeeper)) {} ~TimekeeperScheduledExecutor() { DCHECK(!keepAliveCounter_); } void run(Func); KeepAlive parent_; Function()> getTimekeeper_; std::atomic keepAliveCounter_{1}; }; } // namespace folly