diff options
| author | orivej <[email protected]> | 2022-02-10 16:45:01 +0300 |
|---|---|---|
| committer | Daniil Cherednik <[email protected]> | 2022-02-10 16:45:01 +0300 |
| commit | 2d37894b1b037cf24231090eda8589bbb44fb6fc (patch) | |
| tree | be835aa92c6248212e705f25388ebafcf84bc7a1 /contrib/libs/llvm12/include/llvm/Support/ThreadPool.h | |
| parent | 718c552901d703c502ccbefdfc3c9028d608b947 (diff) | |
Restoring authorship annotation for <[email protected]>. Commit 2 of 2.
Diffstat (limited to 'contrib/libs/llvm12/include/llvm/Support/ThreadPool.h')
| -rw-r--r-- | contrib/libs/llvm12/include/llvm/Support/ThreadPool.h | 232 |
1 files changed, 116 insertions, 116 deletions
diff --git a/contrib/libs/llvm12/include/llvm/Support/ThreadPool.h b/contrib/libs/llvm12/include/llvm/Support/ThreadPool.h index f49446645df..0da24414bff 100644 --- a/contrib/libs/llvm12/include/llvm/Support/ThreadPool.h +++ b/contrib/libs/llvm12/include/llvm/Support/ThreadPool.h @@ -1,116 +1,116 @@ -#pragma once - -#ifdef __GNUC__ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wunused-parameter" -#endif - -//===-- llvm/Support/ThreadPool.h - 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 defines a crude C++11 based thread pool. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_SUPPORT_THREAD_POOL_H -#define LLVM_SUPPORT_THREAD_POOL_H - -#include "llvm/Config/llvm-config.h" -#include "llvm/Support/Threading.h" -#include "llvm/Support/thread.h" - -#include <future> - -#include <atomic> -#include <condition_variable> -#include <functional> -#include <memory> -#include <mutex> -#include <queue> -#include <utility> - -namespace llvm { - -/// A ThreadPool for asynchronous parallel execution on a defined number of -/// threads. -/// -/// The pool keeps a vector of threads alive, waiting on a condition variable -/// for some work to become available. -class ThreadPool { -public: - using TaskTy = std::function<void()>; - using PackagedTaskTy = std::packaged_task<void()>; - - /// Construct a pool using the hardware strategy \p S for mapping hardware - /// execution resources (threads, cores, CPUs) - /// Defaults to using the maximum execution resources in the system, but - /// accounting for the affinity mask. - ThreadPool(ThreadPoolStrategy S = hardware_concurrency()); - - /// Blocking destructor: the pool will wait for all the threads to complete. - ~ThreadPool(); - - /// Asynchronous submission of a task to the pool. The returned future can be - /// used to wait for the task to finish and is *non-blocking* on destruction. - template <typename Function, typename... Args> - inline std::shared_future<void> async(Function &&F, Args &&... ArgList) { - auto Task = - std::bind(std::forward<Function>(F), std::forward<Args>(ArgList)...); - return asyncImpl(std::move(Task)); - } - - /// Asynchronous submission of a task to the pool. The returned future can be - /// used to wait for the task to finish and is *non-blocking* on destruction. - template <typename Function> - inline std::shared_future<void> async(Function &&F) { - return asyncImpl(std::forward<Function>(F)); - } - - /// Blocking wait for all the threads to complete and the queue to be empty. - /// It is an error to try to add new tasks while blocking on this call. - void wait(); - - unsigned getThreadCount() const { return ThreadCount; } - -private: - bool workCompletedUnlocked() { return !ActiveThreads && Tasks.empty(); } - - /// Asynchronous submission of a task to the pool. The returned future can be - /// used to wait for the task to finish and is *non-blocking* on destruction. - std::shared_future<void> asyncImpl(TaskTy F); - - /// Threads in flight - std::vector<llvm::thread> Threads; - - /// Tasks waiting for execution in the pool. - std::queue<PackagedTaskTy> Tasks; - - /// Locking and signaling for accessing the Tasks queue. - std::mutex QueueLock; - std::condition_variable QueueCondition; - - /// Signaling for job completion - std::condition_variable CompletionCondition; - - /// Keep track of the number of thread actually busy - unsigned ActiveThreads = 0; - -#if LLVM_ENABLE_THREADS // avoids warning for unused variable - /// Signal for the destruction of the pool, asking thread to exit. - bool EnableFlag = true; -#endif - - unsigned ThreadCount; -}; -} - -#endif // LLVM_SUPPORT_THREAD_POOL_H - -#ifdef __GNUC__ -#pragma GCC diagnostic pop -#endif +#pragma once + +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wunused-parameter" +#endif + +//===-- llvm/Support/ThreadPool.h - 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 defines a crude C++11 based thread pool. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_SUPPORT_THREAD_POOL_H +#define LLVM_SUPPORT_THREAD_POOL_H + +#include "llvm/Config/llvm-config.h" +#include "llvm/Support/Threading.h" +#include "llvm/Support/thread.h" + +#include <future> + +#include <atomic> +#include <condition_variable> +#include <functional> +#include <memory> +#include <mutex> +#include <queue> +#include <utility> + +namespace llvm { + +/// A ThreadPool for asynchronous parallel execution on a defined number of +/// threads. +/// +/// The pool keeps a vector of threads alive, waiting on a condition variable +/// for some work to become available. +class ThreadPool { +public: + using TaskTy = std::function<void()>; + using PackagedTaskTy = std::packaged_task<void()>; + + /// Construct a pool using the hardware strategy \p S for mapping hardware + /// execution resources (threads, cores, CPUs) + /// Defaults to using the maximum execution resources in the system, but + /// accounting for the affinity mask. + ThreadPool(ThreadPoolStrategy S = hardware_concurrency()); + + /// Blocking destructor: the pool will wait for all the threads to complete. + ~ThreadPool(); + + /// Asynchronous submission of a task to the pool. The returned future can be + /// used to wait for the task to finish and is *non-blocking* on destruction. + template <typename Function, typename... Args> + inline std::shared_future<void> async(Function &&F, Args &&... ArgList) { + auto Task = + std::bind(std::forward<Function>(F), std::forward<Args>(ArgList)...); + return asyncImpl(std::move(Task)); + } + + /// Asynchronous submission of a task to the pool. The returned future can be + /// used to wait for the task to finish and is *non-blocking* on destruction. + template <typename Function> + inline std::shared_future<void> async(Function &&F) { + return asyncImpl(std::forward<Function>(F)); + } + + /// Blocking wait for all the threads to complete and the queue to be empty. + /// It is an error to try to add new tasks while blocking on this call. + void wait(); + + unsigned getThreadCount() const { return ThreadCount; } + +private: + bool workCompletedUnlocked() { return !ActiveThreads && Tasks.empty(); } + + /// Asynchronous submission of a task to the pool. The returned future can be + /// used to wait for the task to finish and is *non-blocking* on destruction. + std::shared_future<void> asyncImpl(TaskTy F); + + /// Threads in flight + std::vector<llvm::thread> Threads; + + /// Tasks waiting for execution in the pool. + std::queue<PackagedTaskTy> Tasks; + + /// Locking and signaling for accessing the Tasks queue. + std::mutex QueueLock; + std::condition_variable QueueCondition; + + /// Signaling for job completion + std::condition_variable CompletionCondition; + + /// Keep track of the number of thread actually busy + unsigned ActiveThreads = 0; + +#if LLVM_ENABLE_THREADS // avoids warning for unused variable + /// Signal for the destruction of the pool, asking thread to exit. + bool EnableFlag = true; +#endif + + unsigned ThreadCount; +}; +} + +#endif // LLVM_SUPPORT_THREAD_POOL_H + +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif |
