mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-24 13:33:37 +02:00
54fc055738
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
67 lines
1.6 KiB
C++
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
|