Author: hokein Date: Thu Dec 13 05:09:50 2018 New Revision: 349032 URL: http://llvm.org/viewvc/llvm-project?rev=349032&view=rev Log: [clangd] Avoid emitting Queued status when we are able to acquire the Barrier.
Reviewers: ilya-biryukov Subscribers: javed.absar, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D55359 Modified: clang-tools-extra/trunk/clangd/TUScheduler.cpp clang-tools-extra/trunk/clangd/Threading.cpp clang-tools-extra/trunk/clangd/Threading.h clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp Modified: clang-tools-extra/trunk/clangd/TUScheduler.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/TUScheduler.cpp?rev=349032&r1=349031&r2=349032&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/TUScheduler.cpp (original) +++ clang-tools-extra/trunk/clangd/TUScheduler.cpp Thu Dec 13 05:09:50 2018 @@ -634,9 +634,11 @@ void ASTWorker::run() { } // unlock Mutex { - // FIXME: only emit this status when the Barrier couldn't be acquired. - emitTUStatus({TUAction::Queued, Req.Name}); - std::lock_guard<Semaphore> BarrierLock(Barrier); + std::unique_lock<Semaphore> Lock(Barrier, std::try_to_lock); + if (!Lock.owns_lock()) { + emitTUStatus({TUAction::Queued, Req.Name}); + Lock.lock(); + } WithContext Guard(std::move(Req.Ctx)); trace::Span Tracer(Req.Name); emitTUStatus({TUAction::RunningAction, Req.Name}); Modified: clang-tools-extra/trunk/clangd/Threading.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Threading.cpp?rev=349032&r1=349031&r2=349032&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Threading.cpp (original) +++ clang-tools-extra/trunk/clangd/Threading.cpp Thu Dec 13 05:09:50 2018 @@ -28,6 +28,15 @@ void Notification::wait() const { Semaphore::Semaphore(std::size_t MaxLocks) : FreeSlots(MaxLocks) {} +bool Semaphore::try_lock() { + std::unique_lock<std::mutex> Lock(Mutex); + if (FreeSlots > 0) { + --FreeSlots; + return true; + } + return false; +} + void Semaphore::lock() { trace::Span Span("WaitForFreeSemaphoreSlot"); // trace::Span can also acquire locks in ctor and dtor, we make sure it Modified: clang-tools-extra/trunk/clangd/Threading.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Threading.h?rev=349032&r1=349031&r2=349032&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Threading.h (original) +++ clang-tools-extra/trunk/clangd/Threading.h Thu Dec 13 05:09:50 2018 @@ -42,6 +42,7 @@ class Semaphore { public: Semaphore(std::size_t MaxLocks); + bool try_lock(); void lock(); void unlock(); 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=349032&r1=349031&r2=349032&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp (original) +++ clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp Thu Dec 13 05:09:50 2018 @@ -698,13 +698,11 @@ TEST_F(TUSchedulerTests, TUStatus) { EXPECT_THAT(CaptureTUStatus.AllStatus, ElementsAre( // Statuses of "Update" action. - TUState(TUAction::Queued, "Update"), TUState(TUAction::RunningAction, "Update"), TUState(TUAction::BuildingPreamble, "Update"), TUState(TUAction::BuildingFile, "Update"), // Statuses of "Definitions" action - TUState(TUAction::Queued, "Definitions"), TUState(TUAction::RunningAction, "Definitions"), TUState(TUAction::Idle, /*No action*/ ""))); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits