[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