1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-21 03:53:04 +02:00
llvm-mirror/include/llvm/Support/thread.h
Mehdi Amini 54fc055738 Add a C++11 ThreadPool implementation in LLVM
This is a very simple implementation of a thread pool using C++11
thread. It accepts any std::function<void()> for asynchronous
execution. Individual task can be synchronize using the returned
future, or the client can block on the full queue completion.

In case LLVM is configured with Threading disabled, it falls back
to sequential execution using std::async with launch:deferred.

This is intended to support parallelism for ThinLTO processing in
linker plugin, but is generic enough for any other uses.

This is a recommit of r255444 ; trying to workaround a bug in the
MSVC 2013 standard library. I think I was hit by:

 http://connect.microsoft.com/VisualStudio/feedbackdetail/view/791185/std-packaged-task-t-where-t-is-void-or-a-reference-class-are-not-movable

Recommit of r255589, trying to please g++ as well.

Differential Revision: http://reviews.llvm.org/D15464

From: mehdi_amini <mehdi_amini@91177308-0d34-0410-b5e6-96231b3b80d8>
llvm-svn: 255593
2015-12-15 00:59:19 +00:00

67 lines
1.6 KiB
C++

//===-- llvm/Support/thread.h - Wrapper for <thread> ------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This header is a wrapper for <thread> that works around problems with the
// MSVC headers when exceptions are disabled. It also provides llvm::thread,
// which is either a typedef of std::thread or a replacement that calls the
// function synchronously depending on the value of LLVM_ENABLE_THREADS.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_SUPPORT_THREAD_H
#define LLVM_SUPPORT_THREAD_H
#include "llvm/Config/llvm-config.h"
#if LLVM_ENABLE_THREADS
#ifdef _MSC_VER
// concrt.h depends on eh.h for __uncaught_exception declaration
// even if we disable exceptions.
#include <eh.h>
// Suppress 'C++ exception handler used, but unwind semantics are not enabled.'
#pragma warning(push)
#pragma warning(disable:4530)
#endif
#include <thread>
#ifdef _MSC_VER
#pragma warning(pop)
#endif
namespace llvm {
typedef std::thread thread;
}
#else // !LLVM_ENABLE_THREADS
#include <utility>
namespace llvm {
struct thread {
thread() {}
thread(thread &&other) {}
template <class Function, class... Args>
explicit thread(Function &&f, Args &&... args) {
f(std::forward<Args>(args)...);
}
thread(const thread &) = delete;
void join() {}
};
}
#endif // LLVM_ENABLE_THREADS
#endif