1#ifndef PROTEUS_ASYNC_COMPILER_H
2#define PROTEUS_ASYNC_COMPILER_H
10#include <condition_variable>
30 void set(std::unique_ptr<MemoryBuffer> ObjBuf) {
31 ResultObjBuf = std::move(ObjBuf);
37 while (!IsReadyFlag) {
38 std::this_thread::yield();
42 std::unique_ptr<MemoryBuffer>
take() {
return std::move(ResultObjBuf); }
45 std::atomic<bool> IsReadyFlag;
46 std::unique_ptr<MemoryBuffer> ResultObjBuf;
52 std::unique_lock Lock{Mutex};
54 HashT HashValue = CT.getHashValue();
55 Worklist.emplace_back(std::move(CT));
56 CompilationResultMap.emplace(HashValue,
57 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();
82 static ShutdownGuard Guard{
this};
85 CompilationResultMap.at(CT.
getHashValue())->set(std::move(ObjBuf));
90 <<
"Thread exiting! Compiled " + std::to_string(Count) +
"\n");
95 std::unique_lock Lock{Mutex};
102 CondVar.notify_all();
104 for (
auto &Thread : Threads)
105 if (Thread.joinable())
112 std::unique_lock Lock{Mutex};
113 return !(CompilationResultMap.find(HashValue) ==
114 CompilationResultMap.end());
120 std::unique_lock Lock{Mutex};
121 auto It = CompilationResultMap.find(HashValue);
122 if (It == CompilationResultMap.end())
125 std::unique_ptr<CompilationResult> &CRes = It->second;
134 if (!CRes->isReady())
140 std::unique_ptr<MemoryBuffer> ObjBuf = CRes->take();
143 CompilationResultMap.erase(HashValue);
150 for (
int I = 0; I < NumThreads; ++I)
160 struct ShutdownGuard {
170 std::condition_variable CondVar;
171 std::unordered_map<HashT, std::unique_ptr<CompilationResult>>
172 CompilationResultMap;
173 std::deque<CompilationTask> Worklist;
174 std::vector<std::thread> Threads;
#define PROTEUS_DBG(x)
Definition Debug.h:9
#define TIMESCOPE(...)
Definition TimeTracing.h:66
Definition CompilerAsync.h:18
CompilationResult(CompilationResult &&) noexcept=delete
void set(std::unique_ptr< MemoryBuffer > ObjBuf)
Definition CompilerAsync.h:30
bool isReady()
Definition CompilerAsync.h:28
CompilationResult(const CompilationResult &)=delete
CompilationResult & operator=(const CompilationResult &)=delete
std::unique_ptr< MemoryBuffer > take()
Definition CompilerAsync.h:42
void wait()
Definition CompilerAsync.h:35
CompilationResult()
Definition CompilerAsync.h:20
Definition CompilationTask.h:19
HashT getHashValue() const
Definition CompilationTask.h:111
std::unique_ptr< MemoryBuffer > compile()
Definition CompilationTask.h:113
Definition CompilerAsync.h:49
bool isCompilationPending(HashT HashValue)
Definition CompilerAsync.h:111
CompilerAsync(int NumThreads)
Definition CompilerAsync.h:148
void compile(CompilationTask &&CT)
Definition CompilerAsync.h:51
std::unique_ptr< MemoryBuffer > takeCompilationResult(HashT HashValue, bool BlockingWait)
Definition CompilerAsync.h:117
void joinAllThreads()
Definition CompilerAsync.h:93
~CompilerAsync()
Definition CompilerAsync.h:154
void run()
Definition CompilerAsync.h:61
static llvm::raw_ostream & logs(const std::string &Name)
Definition Logger.h:19
Definition TimeTracingInit.h:29
Definition CompiledLibrary.h:7
Definition MemoryCache.h:27
void reportFatalError(const llvm::Twine &Reason, const char *FILE, unsigned Line)
Definition Error.cpp:14