summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clangd/Threading.cpp12
1 files changed, 9 insertions, 3 deletions
diff --git a/clang-tools-extra/clangd/Threading.cpp b/clang-tools-extra/clangd/Threading.cpp
index 22206114ff8..dfd0d2eec28 100644
--- a/clang-tools-extra/clangd/Threading.cpp
+++ b/clang-tools-extra/clangd/Threading.cpp
@@ -1,4 +1,5 @@
#include "Threading.h"
+#include "Trace.h"
#include "llvm/ADT/ScopeExit.h"
#include "llvm/Support/FormatVariadic.h"
#include "llvm/Support/Threading.h"
@@ -23,9 +24,14 @@ void Notification::wait() const {
Semaphore::Semaphore(std::size_t MaxLocks) : FreeSlots(MaxLocks) {}
void Semaphore::lock() {
- std::unique_lock<std::mutex> Lock(Mutex);
- SlotsChanged.wait(Lock, [&]() { return FreeSlots > 0; });
- --FreeSlots;
+ trace::Span Span("WaitForFreeSemaphoreSlot");
+ // trace::Span can also acquire locks in ctor and dtor, we make sure it
+ // happens when Semaphore's own lock is not held.
+ {
+ std::unique_lock<std::mutex> Lock(Mutex);
+ SlotsChanged.wait(Lock, [&]() { return FreeSlots > 0; });
+ --FreeSlots;
+ }
}
void Semaphore::unlock() {
OpenPOWER on IntegriCloud