[clang-tools-extra] r345268 - [clangd] workspace/symbol should be async, it reads from the index.
Sam McCall via cfe-commits
cfe-commits at lists.llvm.org
Thu Oct 25 07:19:14 PDT 2018
Author: sammccall
Date: Thu Oct 25 07:19:14 2018
New Revision: 345268
URL: http://llvm.org/viewvc/llvm-project?rev=345268&view=rev
Log:
[clangd] workspace/symbol should be async, it reads from the index.
Summary:
To enable this, TUScheduler has to provide a way to run async tasks without
needing a preamble or AST!
Reviewers: ilya-biryukov
Subscribers: javed.absar, ioeric, MaskRay, jkorous, arphaman, jfb, kadircet, cfe-commits
Differential Revision: https://reviews.llvm.org/D53644
Modified:
clang-tools-extra/trunk/clangd/ClangdServer.cpp
clang-tools-extra/trunk/clangd/TUScheduler.cpp
clang-tools-extra/trunk/clangd/TUScheduler.h
clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp
Modified: clang-tools-extra/trunk/clangd/ClangdServer.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdServer.cpp?rev=345268&r1=345267&r2=345268&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ClangdServer.cpp (original)
+++ clang-tools-extra/trunk/clangd/ClangdServer.cpp Thu Oct 25 07:19:14 2018
@@ -482,8 +482,15 @@ void ClangdServer::onFileEvent(const Did
void ClangdServer::workspaceSymbols(
StringRef Query, int Limit, Callback<std::vector<SymbolInformation>> CB) {
- CB(clangd::getWorkspaceSymbols(Query, Limit, Index,
- WorkspaceRoot.getValueOr("")));
+ std::string QueryCopy = Query;
+ WorkScheduler.run(
+ "getWorkspaceSymbols",
+ Bind(
+ [QueryCopy, Limit, this](decltype(CB) CB) {
+ CB(clangd::getWorkspaceSymbols(QueryCopy, Limit, Index,
+ WorkspaceRoot.getValueOr("")));
+ },
+ std::move(CB)));
}
void ClangdServer::documentSymbols(
Modified: clang-tools-extra/trunk/clangd/TUScheduler.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/TUScheduler.cpp?rev=345268&r1=345267&r2=345268&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/TUScheduler.cpp (original)
+++ clang-tools-extra/trunk/clangd/TUScheduler.cpp Thu Oct 25 07:19:14 2018
@@ -720,6 +720,12 @@ void TUScheduler::remove(PathRef File) {
File);
}
+void TUScheduler::run(StringRef Name, unique_function<void()> Action) {
+ if (!PreambleTasks)
+ return Action();
+ PreambleTasks->runAsync(Name, std::move(Action));
+}
+
void TUScheduler::runWithAST(
StringRef Name, PathRef File,
unique_function<void(Expected<InputsAndAST>)> Action) {
Modified: clang-tools-extra/trunk/clangd/TUScheduler.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/TUScheduler.h?rev=345268&r1=345267&r2=345268&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/TUScheduler.h (original)
+++ clang-tools-extra/trunk/clangd/TUScheduler.h Thu Oct 25 07:19:14 2018
@@ -108,6 +108,9 @@ public:
/// resources.
void remove(PathRef File);
+ /// Schedule an async task with no dependencies.
+ void run(llvm::StringRef Name, llvm::unique_function<void()> Action);
+
/// Schedule an async read of the AST. \p Action will be called when AST is
/// ready. The AST passed to \p Action refers to the version of \p File
/// tracked at the time of the call, even if new updates are received before
Modified: clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp?rev=345268&r1=345267&r2=345268&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp (original)
+++ clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp Thu Oct 25 07:19:14 2018
@@ -532,6 +532,18 @@ TEST_F(TUSchedulerTests, NoChangeDiags)
ASSERT_TRUE(S.blockUntilIdle(timeoutSeconds(10)));
}
+TEST_F(TUSchedulerTests, Run) {
+ TUScheduler S(/*AsyncThreadsCount=*/getDefaultAsyncThreadsCount(),
+ /*StorePreambleInMemory=*/true, /*ASTCallbacks=*/nullptr,
+ /*UpdateDebounce=*/std::chrono::steady_clock::duration::zero(),
+ ASTRetentionPolicy());
+ std::atomic<int> Counter(0);
+ S.run("add 1", [&] { ++Counter; });
+ S.run("add 2", [&] { Counter += 2; });
+ ASSERT_TRUE(S.blockUntilIdle(timeoutSeconds(10)));
+ EXPECT_EQ(Counter.load(), 3);
+}
+
} // namespace
} // namespace clangd
} // namespace clang
More information about the cfe-commits
mailing list