[llvm] 9eb591f - [ORC] Only use JITDylib::GeneratorsMutex while running generators.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Wed Dec 1 22:37:00 PST 2021
Author: Lang Hames
Date: 2021-12-02T17:36:32+11:00
New Revision: 9eb591f0ace7275ce8c3be190975e10aaa142171
URL: https://github.com/llvm/llvm-project/commit/9eb591f0ace7275ce8c3be190975e10aaa142171
DIFF: https://github.com/llvm/llvm-project/commit/9eb591f0ace7275ce8c3be190975e10aaa142171.diff
LOG: [ORC] Only use JITDylib::GeneratorsMutex while running generators.
GeneratorsMutex should prevent lookups from proceeding through the
generators of a single JITDylib concurrently (since this could
result in redundant attempts to generate definitions). Mutation of
the generators list itself should be done under the session lock.
Added:
Modified:
llvm/include/llvm/ExecutionEngine/Orc/Core.h
llvm/lib/ExecutionEngine/Orc/Core.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/Core.h b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
index d11a0c9df74d..8ca2725566c5 100644
--- a/llvm/include/llvm/ExecutionEngine/Orc/Core.h
+++ b/llvm/include/llvm/ExecutionEngine/Orc/Core.h
@@ -1680,8 +1680,9 @@ Error MaterializationResponsibility::withResourceKeyDo(Func &&F) const {
template <typename GeneratorT>
GeneratorT &JITDylib::addGenerator(std::unique_ptr<GeneratorT> DefGenerator) {
auto &G = *DefGenerator;
- std::lock_guard<std::mutex> Lock(GeneratorsMutex);
- DefGenerators.push_back(std::move(DefGenerator));
+ ES.runSessionLocked([&] {
+ DefGenerators.push_back(std::move(DefGenerator));
+ });
return G;
}
diff --git a/llvm/lib/ExecutionEngine/Orc/Core.cpp b/llvm/lib/ExecutionEngine/Orc/Core.cpp
index afd116b646ad..15648a8541cc 100644
--- a/llvm/lib/ExecutionEngine/Orc/Core.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/Core.cpp
@@ -642,13 +642,14 @@ ResourceTrackerSP JITDylib::createResourceTracker() {
}
void JITDylib::removeGenerator(DefinitionGenerator &G) {
- std::lock_guard<std::mutex> Lock(GeneratorsMutex);
- auto I = llvm::find_if(DefGenerators,
- [&](const std::shared_ptr<DefinitionGenerator> &H) {
- return H.get() == &G;
- });
- assert(I != DefGenerators.end() && "Generator not found");
- DefGenerators.erase(I);
+ ES.runSessionLocked([&] {
+ auto I = llvm::find_if(DefGenerators,
+ [&](const std::shared_ptr<DefinitionGenerator> &H) {
+ return H.get() == &G;
+ });
+ assert(I != DefGenerators.end() && "Generator not found");
+ DefGenerators.erase(I);
+ });
}
Expected<SymbolFlagsMap>
@@ -2311,8 +2312,11 @@ void ExecutionSession::OL_applyQueryPhase1(
});
// Build the definition generator stack for this JITDylib.
- for (auto &DG : reverse(JD.DefGenerators))
- IPLS->CurDefGeneratorStack.push_back(DG);
+ runSessionLocked([&] {
+ IPLS->CurDefGeneratorStack.reserve(JD.DefGenerators.size());
+ for (auto &DG : reverse(JD.DefGenerators))
+ IPLS->CurDefGeneratorStack.push_back(DG);
+ });
// Flag that we've done our initialization.
IPLS->NewJITDylib = false;
More information about the llvm-commits
mailing list