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};
57 HashT HashValue = CT.getHashValue();
58 Worklist.emplace_back(std::move(CT));
59 CompilationResultMap.emplace(HashValue,
60 std::make_unique<CompilationResult>());
65 [[maybe_unused]]
int Count = 0;
67 std::unique_lock Lock(Mutex);
68 CondVar.wait(Lock, [
this] {
return !Worklist.empty() || !Active; });
78 std::unique_ptr<MemoryBuffer> ObjBuf = CT.
compile();
80 CompilationResultMap.at(CT.
getHashValue())->set(std::move(ObjBuf));
85 <<
"Thread exiting! Compiled " + std::to_string(Count) +
"\n");
90 std::unique_lock Lock{Mutex};
99 for (
auto &Thread : Threads)
106 std::unique_lock Lock{Mutex};
107 return !(CompilationResultMap.find(HashValue) ==
108 CompilationResultMap.end());
113 std::unique_lock Lock{Mutex};
114 auto It = CompilationResultMap.find(HashValue);
115 if (It == CompilationResultMap.end())
118 std::unique_ptr<CompilationResult> &CRes = It->second;
127 if (!CRes->isReady())
133 std::unique_ptr<MemoryBuffer> ObjBuf = CRes->take();
136 CompilationResultMap.erase(HashValue);
144 std::condition_variable CondVar;
145 std::unordered_map<HashT, std::unique_ptr<CompilationResult>>
146 CompilationResultMap;
147 std::deque<CompilationTask> Worklist;
148 std::vector<std::thread> Threads;
152 for (
int I = 0; I < NumThreads; ++I)
#define PROTEUS_DBG(x)
Definition Debug.h:10
#define PROTEUS_FATAL_ERROR(x)
Definition Error.h:7
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:102
std::unique_ptr< MemoryBuffer > compile()
Definition CompilationTask.hpp:104
Definition CompilerAsync.hpp:47
bool isCompilationPending(HashT HashValue)
Definition CompilerAsync.hpp:105
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:111
void joinAllThreads()
Definition CompilerAsync.hpp:88
void run()
Definition CompilerAsync.hpp:64
Definition Hashing.hpp:20
static llvm::raw_ostream & logs(const std::string &Name)
Definition Logger.hpp:19
Definition BuiltinsCUDA.cpp:4