Fix JIT on separate thread When JIT_IN_SEPARATE_THREAD is defined we generate Reactor routines on LLVM in a new thread. Since concurrent code generation was enabled by making ::jit thread-local, we need to assign it the pointer of the thread that creates the new thread. Bug: b/153803432 Change-Id: Ia7454ac5823d61a1fb139b337d2af2de3a5104af Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/44048 Tested-by: Nicolas Capens <nicolascapens@google.com> Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Reactor/LLVMReactor.cpp b/src/Reactor/LLVMReactor.cpp index 48861e9..6e184b8 100644 --- a/src/Reactor/LLVMReactor.cpp +++ b/src/Reactor/LLVMReactor.cpp
@@ -634,7 +634,11 @@ { std::shared_ptr<Routine> routine; - auto acquire = [&]() { + auto acquire = [&](std::unique_ptr<rr::JITBuilder> jitBuilder) { + // ::jit is thread-local, so when this is executed on a separate thread (see JIT_IN_SEPARATE_THREAD) + // it needs to be assigned the value from the parent thread. + jit = std::move(jitBuilder); + auto cfg = cfgEdit.apply(jit->config); if(jit->builder->GetInsertBlock()->empty() || !jit->builder->GetInsertBlock()->back().isTerminator()) @@ -691,10 +695,10 @@ // FIXME(b/149829034): This is not a long-term solution. Reactor has no control // over the threading and stack sizes of its users, so this should be addressed // at a higher level instead. - std::thread thread(acquire); + std::thread thread(acquire, std::move(jit)); thread.join(); #else - acquire(); + acquire(std::move(jit)); #endif return routine;