diff options
| -rw-r--r-- | clang-tools-extra/clangd/TUScheduler.cpp | 8 | ||||
| -rw-r--r-- | clang-tools-extra/clangd/Threading.cpp | 9 | ||||
| -rw-r--r-- | clang-tools-extra/clangd/Threading.h | 1 | ||||
| -rw-r--r-- | clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp | 2 |
4 files changed, 15 insertions, 5 deletions
diff --git a/clang-tools-extra/clangd/TUScheduler.cpp b/clang-tools-extra/clangd/TUScheduler.cpp index b53fe3f5509..764bc26a4dc 100644 --- a/clang-tools-extra/clangd/TUScheduler.cpp +++ b/clang-tools-extra/clangd/TUScheduler.cpp @@ -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}); diff --git a/clang-tools-extra/clangd/Threading.cpp b/clang-tools-extra/clangd/Threading.cpp index b427ce37ca2..cfb5e02a3f3 100644 --- a/clang-tools-extra/clangd/Threading.cpp +++ b/clang-tools-extra/clangd/Threading.cpp @@ -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 diff --git a/clang-tools-extra/clangd/Threading.h b/clang-tools-extra/clangd/Threading.h index 1b34831a15c..628dd558661 100644 --- a/clang-tools-extra/clangd/Threading.h +++ b/clang-tools-extra/clangd/Threading.h @@ -42,6 +42,7 @@ class Semaphore { public: Semaphore(std::size_t MaxLocks); + bool try_lock(); void lock(); void unlock(); diff --git a/clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp b/clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp index 674ab19b385..b26a7dd0b3c 100644 --- a/clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp +++ b/clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp @@ -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*/ ""))); } |

