1#ifndef PROTEUS_ASYNC_COMPILER_HPP
2#define PROTEUS_ASYNC_COMPILER_HPP
4#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;
55 std::unique_lock Lock{Mutex};
56 Worklist.emplace_back(std::move(CT));
57 CompilationResultMap.emplace(CT.getHashValue(),
58 std::make_unique<CompilationResult>());
63 [[maybe_unused]]
int Count = 0;
65 std::unique_lock Lock(Mutex);
66 CondVar.wait(Lock, [
this] {
return !Worklist.empty() || !Active; });
76 std::unique_ptr<MemoryBuffer> ObjBuf = CT.
compile();
78 CompilationResultMap.at(CT.
getHashValue())->set(std::move(ObjBuf));
83 <<
"Thread exiting! Compiled " + std::to_string(Count) +
"\n");
90 for (
auto &Thread : Threads)
97 std::unique_lock Lock{Mutex};
98 return !(CompilationResultMap.find(HashValue) ==
99 CompilationResultMap.end());
104 std::unique_lock Lock{Mutex};
105 auto It = CompilationResultMap.find(HashValue);
106 if (It == CompilationResultMap.end())
109 std::unique_ptr<CompilationResult> &CRes = It->second;
115 if (!CRes->isReady())
121 std::unique_ptr<MemoryBuffer> ObjBuf = CRes->take();
125 CompilationResultMap.erase(HashValue);
131 std::atomic<bool> Active;
133 std::condition_variable CondVar;
134 std::unordered_map<HashT, std::unique_ptr<CompilationResult>>
135 CompilationResultMap;
136 std::deque<CompilationTask> Worklist;
137 std::vector<std::thread> Threads;
141 for (
int I = 0; I < NumThreads; ++I)
146 if (Threads.size() > 0)
#define PROTEUS_DBG(x)
Definition Debug.h:7
#define PROTEUS_FATAL_ERROR(x)
Definition Error.h:4
Definition CompilerAsync.hpp:16
CompilationResult(CompilationResult &&) noexcept=delete
void set(std::unique_ptr< MemoryBuffer > ObjBuf)
Definition CompilerAsync.hpp:28
bool isReady()
Definition CompilerAsync.hpp:26
CompilationResult(const CompilationResult &)=delete
CompilationResult & operator=(const CompilationResult &)=delete
std::unique_ptr< MemoryBuffer > take()
Definition CompilerAsync.hpp:40
void wait()
Definition CompilerAsync.hpp:33
CompilationResult()
Definition CompilerAsync.hpp:18
Definition CompilationTask.hpp:17
HashT getHashValue() const
Definition CompilationTask.hpp:82
std::unique_ptr< MemoryBuffer > compile()
Definition CompilationTask.hpp:84
Definition CompilerAsync.hpp:47
bool isCompilationPending(HashT HashValue)
Definition CompilerAsync.hpp:96
static CompilerAsync & instance(int NumThreads)
Definition CompilerAsync.hpp:49
void compile(CompilationTask &&CT)
Definition CompilerAsync.hpp:54
std::unique_ptr< MemoryBuffer > takeCompilationResult(HashT HashValue, bool BlockingWait)
Definition CompilerAsync.hpp:102
void joinAllThreads()
Definition CompilerAsync.hpp:86
void run()
Definition CompilerAsync.hpp:62
Definition Hashing.hpp:19
static llvm::raw_ostream & logs(const std::string &Name)
Definition Logger.hpp:18
Definition JitEngine.cpp:20