//==-- llvm/Support/ThreadPool.cpp - A ThreadPool implementation -*- C++ -*-==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file implements a crude C++11 based thread pool. // //===----------------------------------------------------------------------===// #include "llvm/Support/ThreadPool.h" #include "llvm/Config/llvm-config.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Threading.h" #include "llvm/Support/raw_ostream.h" usingnamespacellvm; ThreadPoolInterface::~ThreadPoolInterface() = default; // A note on thread groups: Tasks are by default in no group (represented // by nullptr ThreadPoolTaskGroup pointer in the Tasks queue) and functionality // here normally works on all tasks regardless of their group (functions // in that case receive nullptr ThreadPoolTaskGroup pointer as argument). // A task in a group has a pointer to that ThreadPoolTaskGroup in the Tasks // queue, and functions called to work only on tasks from one group take that // pointer. #if LLVM_ENABLE_THREADS StdThreadPool::StdThreadPool(ThreadPoolStrategy S) : … { … } void StdThreadPool::grow(int requested) { … } #ifndef NDEBUG // The group of the tasks run by the current thread. static LLVM_THREAD_LOCAL std::vector<ThreadPoolTaskGroup *> *CurrentThreadTaskGroups = nullptr; #endif // WaitingForGroup == nullptr means all tasks regardless of their group. void StdThreadPool::processTasks(ThreadPoolTaskGroup *WaitingForGroup) { … } bool StdThreadPool::workCompletedUnlocked(ThreadPoolTaskGroup *Group) const { … } void StdThreadPool::wait() { … } void StdThreadPool::wait(ThreadPoolTaskGroup &Group) { … } bool StdThreadPool::isWorkerThread() const { … } // The destructor joins all threads, waiting for completion. StdThreadPool::~StdThreadPool() { … } #endif // LLVM_ENABLE_THREADS Disabled // No threads are launched, issue a warning if ThreadCount is not 0 SingleThreadExecutor::SingleThreadExecutor(ThreadPoolStrategy S) { … } void SingleThreadExecutor::wait() { … } void SingleThreadExecutor::wait(ThreadPoolTaskGroup &) { … } bool SingleThreadExecutor::isWorkerThread() const { … } SingleThreadExecutor::~SingleThreadExecutor() { … }