1#ifndef PROTEUS_ASYNC_COMPILER_H
2#define PROTEUS_ASYNC_COMPILER_H
8#include <condition_variable>
28 void set(std::unique_ptr<MemoryBuffer> ObjBuf) {
29 ResultObjBuf = std::move(ObjBuf);
35 while (!IsReadyFlag) {
36 std::this_thread::yield();
40 std::unique_ptr<MemoryBuffer>
take() {
return std::move(ResultObjBuf); }
43 std::atomic<bool> IsReadyFlag;
44 std::unique_ptr<MemoryBuffer> ResultObjBuf;
50 std::unique_lock Lock{Mutex};
52 HashT HashValue = CT.getHashValue();
53 Worklist.emplace_back(std::move(CT));
54 CompilationResultMap.emplace(HashValue,
55 std::make_unique<CompilationResult>());
60 [[maybe_unused]]
int Count = 0;
62 std::unique_lock Lock(Mutex);
63 CondVar.wait(Lock, [
this] {
return !Worklist.empty() || !Active; });
73 std::unique_ptr<MemoryBuffer> ObjBuf = CT.
compile();
79 static ShutdownGuard Guard{
this};
82 CompilationResultMap.at(CT.
getHashValue())->set(std::move(ObjBuf));
87 <<
"Thread exiting! Compiled " + std::to_string(Count) +
"\n");
92 std::unique_lock Lock{Mutex};
101 for (
auto &Thread : Threads)
102 if (Thread.joinable())
109 std::unique_lock Lock{Mutex};
110 return !(CompilationResultMap.find(HashValue) ==
111 CompilationResultMap.end());
116 std::unique_lock Lock{Mutex};
117 auto It = CompilationResultMap.find(HashValue);
118 if (It == CompilationResultMap.end())
121 std::unique_ptr<CompilationResult> &CRes = It->second;
130 if (!CRes->isReady())
136 std::unique_ptr<MemoryBuffer> ObjBuf = CRes->take();
139 CompilationResultMap.erase(HashValue);
146 for (
int I = 0; I < NumThreads; ++I)
156 struct ShutdownGuard {
166 std::condition_variable CondVar;
167 std::unordered_map<HashT, std::unique_ptr<CompilationResult>>
168 CompilationResultMap;
169 std::deque<CompilationTask> Worklist;
170 std::vector<std::thread> Threads;
#define PROTEUS_DBG(x)
Definition Debug.h:9
Definition CompilerAsync.h:16
CompilationResult(CompilationResult &&) noexcept=delete
void set(std::unique_ptr< MemoryBuffer > ObjBuf)
Definition CompilerAsync.h:28
bool isReady()
Definition CompilerAsync.h:26
CompilationResult(const CompilationResult &)=delete
CompilationResult & operator=(const CompilationResult &)=delete
std::unique_ptr< MemoryBuffer > take()
Definition CompilerAsync.h:40
void wait()
Definition CompilerAsync.h:33
CompilationResult()
Definition CompilerAsync.h:18
Definition CompilationTask.h:19
HashT getHashValue() const
Definition CompilationTask.h:120
std::unique_ptr< MemoryBuffer > compile()
Definition CompilationTask.h:122
Definition CompilerAsync.h:47
bool isCompilationPending(HashT HashValue)
Definition CompilerAsync.h:108
CompilerAsync(int NumThreads)
Definition CompilerAsync.h:144
void compile(CompilationTask &&CT)
Definition CompilerAsync.h:49
std::unique_ptr< MemoryBuffer > takeCompilationResult(HashT HashValue, bool BlockingWait)
Definition CompilerAsync.h:114
void joinAllThreads()
Definition CompilerAsync.h:90
~CompilerAsync()
Definition CompilerAsync.h:150
void run()
Definition CompilerAsync.h:59
static llvm::raw_ostream & logs(const std::string &Name)
Definition Logger.h:19
Definition CompiledLibrary.h:7
Definition MemoryCache.h:26
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14