/* * Copyright (c) Meta Platforms, Inc. and 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 <algorithm> #include <mutex> #include <queue> #include <glog/logging.h> #include <folly/DefaultKeepAliveExecutor.h> #include <folly/Memory.h> #include <folly/SharedMutex.h> #include <folly/executors/GlobalThreadPoolList.h> #include <folly/executors/task_queue/LifoSemMPMCQueue.h> #include <folly/executors/thread_factory/NamedThreadFactory.h> #include <folly/io/async/Request.h> #include <folly/portability/GFlags.h> #include <folly/synchronization/AtomicStruct.h> #include <folly/synchronization/Baton.h> namespace folly { /* Base class for implementing threadpool based executors. * * Dynamic thread behavior: * * ThreadPoolExecutors may vary their actual running number of threads * between minThreads_ and maxThreads_, tracked by activeThreads_. * The actual implementation of joining an idle thread is left to the * ThreadPoolExecutors' subclass (typically by LifoSem try_take_for * timing out). Idle threads should be removed from threadList_, and * threadsToJoin incremented, and activeThreads_ decremented. * * On task add(), if an executor can guarantee there is an active * thread that will handle the task, then nothing needs to be done. * If not, then ensureActiveThreads() should be called to possibly * start another pool thread, up to maxThreads_. * * ensureJoined() is called on add(), such that we can join idle * threads that were destroyed (which can't be joined from * themselves). * * Thread pool stats accounting: * * Derived classes must register instances to keep stats on all thread * pools by calling registerThreadPoolExecutor(this) on constructions * and deregisterThreadPoolExecutor(this) on destruction. * * Registration must be done wherever getPendingTaskCountImpl is implemented * and getPendingTaskCountImpl should be marked 'final' to avoid data races. */ class ThreadPoolExecutor : public DefaultKeepAliveExecutor { … }; } // namespace folly