Index: clang-tools-extra/trunk/clangd/TUScheduler.cpp =================================================================== --- clang-tools-extra/trunk/clangd/TUScheduler.cpp +++ clang-tools-extra/trunk/clangd/TUScheduler.cpp @@ -634,9 +634,11 @@ } // unlock Mutex { - // FIXME: only emit this status when the Barrier couldn't be acquired. - emitTUStatus({TUAction::Queued, Req.Name}); - std::lock_guard BarrierLock(Barrier); + std::unique_lock 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}); Index: clang-tools-extra/trunk/clangd/Threading.h =================================================================== --- clang-tools-extra/trunk/clangd/Threading.h +++ clang-tools-extra/trunk/clangd/Threading.h @@ -42,6 +42,7 @@ public: Semaphore(std::size_t MaxLocks); + bool try_lock(); void lock(); void unlock(); Index: clang-tools-extra/trunk/clangd/Threading.cpp =================================================================== --- clang-tools-extra/trunk/clangd/Threading.cpp +++ clang-tools-extra/trunk/clangd/Threading.cpp @@ -28,6 +28,15 @@ Semaphore::Semaphore(std::size_t MaxLocks) : FreeSlots(MaxLocks) {} +bool Semaphore::try_lock() { + std::unique_lock 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 Index: clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp =================================================================== --- clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp +++ clang-tools-extra/trunk/unittests/clangd/TUSchedulerTests.cpp @@ -698,13 +698,11 @@ 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*/ ""))); }