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