diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -27,6 +27,8 @@ #include "llvm/Testing/Support/Error.h" #include "gmock/gmock.h" #include "gtest/gtest.h" +#include +#include namespace clang { namespace clangd { @@ -1112,8 +1114,10 @@ bool fuzzyFind(const FuzzyFindRequest &Req, llvm::function_ref Callback) const override { - std::lock_guard Lock(Mut); + std::unique_lock Lock(Mut); Requests.push_back(Req); + ReceivedRequest = true; + ReceivedRequestCV.notify_one(); return true; } @@ -1132,7 +1136,9 @@ size_t estimateMemoryUsage() const override { return 0; } const std::vector consumeRequests() const { - std::lock_guard Lock(Mut); + std::unique_lock Lock(Mut); + ReceivedRequestCV.wait(Lock, [this]() { return ReceivedRequest; }); + ReceivedRequest = false; auto Reqs = std::move(Requests); Requests = {}; return Reqs; @@ -1140,7 +1146,9 @@ private: // We need a mutex to handle async fuzzy find requests. + mutable std::condition_variable ReceivedRequestCV; mutable std::mutex Mut; + mutable bool ReceivedRequest = false; mutable std::vector Requests; }; @@ -2098,9 +2106,6 @@ auto CompleteAtPoint = [&](StringRef P) { cantFail(runCodeComplete(Server, File, Test.point(P), Opts)); - // Sleep for a while to make sure asynchronous call (if applicable) is also - // triggered before callback is invoked. - std::this_thread::sleep_for(std::chrono::milliseconds(100)); }; CompleteAtPoint("1");