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; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits