diff options
| author | Haojian Wu <hokein@google.com> | 2018-12-13 13:09:50 +0000 |
|---|---|---|
| committer | Haojian Wu <hokein@google.com> | 2018-12-13 13:09:50 +0000 |
| commit | e58e0903e20097230cd4186f46c16c05049ac8e8 (patch) | |
| tree | 382243c9c3e99f6b9c4323649bf8ea0a1e04ec2d | |
| parent | 9d0d9f884cebc9a1cad49679b3b64b9fdae2c964 (diff) | |
| download | bcm5719-llvm-e58e0903e20097230cd4186f46c16c05049ac8e8.tar.gz bcm5719-llvm-e58e0903e20097230cd4186f46c16c05049ac8e8.zip | |
[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
llvm-svn: 349032
| -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*/ ""))); } |

