最近在用 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 一个没有两个版本?