summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2018-12-13 13:09:50 +0000
committerHaojian Wu <hokein@google.com>2018-12-13 13:09:50 +0000
commite58e0903e20097230cd4186f46c16c05049ac8e8 (patch)
tree382243c9c3e99f6b9c4323649bf8ea0a1e04ec2d
parent9d0d9f884cebc9a1cad49679b3b64b9fdae2c964 (diff)
downloadbcm5719-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.cpp8
-rw-r--r--clang-tools-extra/clangd/Threading.cpp9
-rw-r--r--clang-tools-extra/clangd/Threading.h1
-rw-r--r--clang-tools-extra/unittests/clangd/TUSchedulerTests.cpp2
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*/ "")));
}
OpenPOWER on IntegriCloud