最近在用 llvm 的 OrcJIT,要將 Module 丟進去跑之前要轉成一個叫
ThreadSafeModule 的東東,再用 llvm::orc::IRLayer add 進去
ThreadSafeModule 大概長這樣:
class ThreadSafeModule {
public:
ThreadSafeModule() = default;
ThreadSafeModule(ThreadSafeModule &&Other) = default;
ThreadSafeModule &operator=(ThreadSafeModule &&Other);
ThreadSafeModule(std::unique_ptr<Module> M, std::unique_ptr<LLVMContext> Ctx)
: M(std::move(M)), TSCtx(std::move(Ctx)) {}
ThreadSafeModule(std::unique_ptr<Module> M, ThreadSafeContext TSCtx)
: M(std::move(M)), TSCtx(std::move(TSCtx)) {}
Module *getModule() { return M.get(); }
const Module *getModule() const { return M.get(); }
ThreadSafeContext::Lock getContextLock() { return TSCtx.getLock(); }
explicit operator bool();
private:
std::unique_ptr<Module> M;
ThreadSafeContext TSCtx;
};
OrcJIT 跑完後如果中間有設 setNotifyCompiled 就會把 ThreadSafeModule 丟回來
然後 Module 就變成 ThreadSafeModule
把 ThreadSafeModule 釋放掉連帶著 Module 也釋放掉了
問題(Question):
1. 這個 ThreadSafeModule 為什麼要弄得像黑洞一樣?不把 Module release 出來
2. 它的 member function 'getModule',為什麼要寫一個有 const 一個沒有兩個版本?