[clang-tools-extra] dc9c096 - [clangd] Make ProjectAwareIndex optionally sync
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 11 11:34:30 PST 2021
Author: Kadir Cetinkaya
Date: 2021-03-11T20:30:35+01:00
New Revision: dc9c09632f1a8cbb0f44a7025ab7b9e516b9d859
URL: https://github.com/llvm/llvm-project/commit/dc9c09632f1a8cbb0f44a7025ab7b9e516b9d859
DIFF: https://github.com/llvm/llvm-project/commit/dc9c09632f1a8cbb0f44a7025ab7b9e516b9d859.diff
LOG: [clangd] Make ProjectAwareIndex optionally sync
Depends on D98029.
Differential Revision: https://reviews.llvm.org/D98165
Added:
Modified:
clang-tools-extra/clangd/index/ProjectAware.cpp
clang-tools-extra/clangd/index/ProjectAware.h
clang-tools-extra/clangd/tool/ClangdMain.cpp
clang-tools-extra/clangd/unittests/ProjectAwareIndexTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/index/ProjectAware.cpp b/clang-tools-extra/clangd/index/ProjectAware.cpp
index 80ebaf903b4c..a6cdc86fdc24 100644
--- a/clang-tools-extra/clangd/index/ProjectAware.cpp
+++ b/clang-tools-extra/clangd/index/ProjectAware.cpp
@@ -57,7 +57,10 @@ class ProjectAwareIndex : public SymbolIndex {
llvm::unique_function<IndexContents(llvm::StringRef) const>
indexedFiles() const override;
- ProjectAwareIndex(IndexFactory Gen) : Gen(std::move(Gen)) {}
+ ProjectAwareIndex(IndexFactory Gen, bool Sync) : Gen(std::move(Gen)) {
+ if (!Sync)
+ Tasks = std::make_unique<AsyncTaskRunner>();
+ }
private:
// Returns the index associated with current context, if any.
@@ -68,7 +71,7 @@ class ProjectAwareIndex : public SymbolIndex {
mutable llvm::DenseMap<Config::ExternalIndexSpec,
std::unique_ptr<SymbolIndex>>
IndexForSpec;
- mutable AsyncTaskRunner Tasks;
+ mutable std::unique_ptr<AsyncTaskRunner> Tasks;
const IndexFactory Gen;
};
@@ -131,14 +134,15 @@ SymbolIndex *ProjectAwareIndex::getIndex() const {
std::lock_guard<std::mutex> Lock(Mu);
auto Entry = IndexForSpec.try_emplace(External, nullptr);
if (Entry.second)
- Entry.first->getSecond() = Gen(External, Tasks);
+ Entry.first->getSecond() = Gen(External, Tasks.get());
return Entry.first->second.get();
}
} // namespace
-std::unique_ptr<SymbolIndex> createProjectAwareIndex(IndexFactory Gen) {
+std::unique_ptr<SymbolIndex> createProjectAwareIndex(IndexFactory Gen,
+ bool Sync) {
assert(Gen);
- return std::make_unique<ProjectAwareIndex>(std::move(Gen));
+ return std::make_unique<ProjectAwareIndex>(std::move(Gen), Sync);
}
} // namespace clangd
} // namespace clang
diff --git a/clang-tools-extra/clangd/index/ProjectAware.h b/clang-tools-extra/clangd/index/ProjectAware.h
index af98ba612751..888ef3add2eb 100644
--- a/clang-tools-extra/clangd/index/ProjectAware.h
+++ b/clang-tools-extra/clangd/index/ProjectAware.h
@@ -19,15 +19,16 @@ namespace clangd {
/// A functor to create an index for an external index specification. Functor
/// should perform any high latency operation in a separate thread through
-/// AsyncTaskRunner.
+/// AsyncTaskRunner, if set.
using IndexFactory = std::function<std::unique_ptr<SymbolIndex>(
- const Config::ExternalIndexSpec &, AsyncTaskRunner &)>;
+ const Config::ExternalIndexSpec &, AsyncTaskRunner *)>;
/// Returns an index that answers queries using external indices. IndexFactory
-/// specifies how to generate an index from an external source.
+/// specifies how to generate an index from an external source. If \p Sync is
+/// set, index won't own any asnyc task runner.
/// IndexFactory must be injected because this code cannot depend on the remote
/// index client.
-std::unique_ptr<SymbolIndex> createProjectAwareIndex(IndexFactory);
+std::unique_ptr<SymbolIndex> createProjectAwareIndex(IndexFactory, bool Sync);
} // namespace clangd
} // namespace clang
diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp
index 3c5b6473be0d..c48821cba2c7 100644
--- a/clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -537,7 +537,7 @@ const char TestScheme::TestDir[] = "/clangd-test";
std::unique_ptr<SymbolIndex>
loadExternalIndex(const Config::ExternalIndexSpec &External,
- AsyncTaskRunner &Tasks) {
+ AsyncTaskRunner *Tasks) {
switch (External.Kind) {
case Config::ExternalIndexSpec::Server:
log("Associating {0} with remote index at {1}.", External.MountPoint,
@@ -552,13 +552,11 @@ loadExternalIndex(const Config::ExternalIndexSpec &External,
if (auto Idx = loadIndex(File, /*UseDex=*/true))
PlaceHolder->reset(std::move(Idx));
};
- // FIXME: The signature should contain a null-able TaskRunner istead, and
- // the task should be scheduled accordingly.
- if (Sync) {
- IndexLoadTask();
+ if (Tasks) {
+ Tasks->runAsync("Load-index:" + External.Location,
+ std::move(IndexLoadTask));
} else {
- Tasks.runAsync("Load-index:" + External.Location,
- std::move(IndexLoadTask));
+ IndexLoadTask();
}
return std::move(NewIndex);
}
@@ -806,7 +804,7 @@ clangd accepts flags on the commandline, and in the CLANGD_FLAGS environment var
}
#endif
Opts.BackgroundIndex = EnableBackgroundIndex;
- auto PAI = createProjectAwareIndex(loadExternalIndex);
+ auto PAI = createProjectAwareIndex(loadExternalIndex, Sync);
if (StaticIdx) {
IdxStack.emplace_back(std::move(StaticIdx));
IdxStack.emplace_back(
diff --git a/clang-tools-extra/clangd/unittests/ProjectAwareIndexTests.cpp b/clang-tools-extra/clangd/unittests/ProjectAwareIndexTests.cpp
index 0d14d2ed5d54..c8ce0c0d154d 100644
--- a/clang-tools-extra/clangd/unittests/ProjectAwareIndexTests.cpp
+++ b/clang-tools-extra/clangd/unittests/ProjectAwareIndexTests.cpp
@@ -33,11 +33,11 @@ std::unique_ptr<SymbolIndex> createIndex() {
}
TEST(ProjectAware, Test) {
- IndexFactory Gen = [](const Config::ExternalIndexSpec &, AsyncTaskRunner &) {
+ IndexFactory Gen = [](const Config::ExternalIndexSpec &, AsyncTaskRunner *) {
return createIndex();
};
- auto Idx = createProjectAwareIndex(std::move(Gen));
+ auto Idx = createProjectAwareIndex(std::move(Gen), true);
FuzzyFindRequest Req;
Req.Query = "1";
Req.AnyScope = true;
@@ -54,12 +54,12 @@ TEST(ProjectAware, Test) {
TEST(ProjectAware, CreatedOnce) {
unsigned InvocationCount = 0;
- IndexFactory Gen = [&](const Config::ExternalIndexSpec &, AsyncTaskRunner &) {
+ IndexFactory Gen = [&](const Config::ExternalIndexSpec &, AsyncTaskRunner *) {
++InvocationCount;
return createIndex();
};
- auto Idx = createProjectAwareIndex(std::move(Gen));
+ auto Idx = createProjectAwareIndex(std::move(Gen), true);
// No invocation at start.
EXPECT_EQ(InvocationCount, 0U);
FuzzyFindRequest Req;
More information about the cfe-commits
mailing list