[clang-tools-extra] d085634 - [clangd] Make Notification a little safer.

Sam McCall via cfe-commits cfe-commits at lists.llvm.org
Sat Jan 25 06:32:32 PST 2020


Author: Sam McCall
Date: 2020-01-25T15:31:55+01:00
New Revision: d08563486e06df3ddb4d7c1018d1e1e762690ee8

URL: https://github.com/llvm/llvm-project/commit/d08563486e06df3ddb4d7c1018d1e1e762690ee8
DIFF: https://github.com/llvm/llvm-project/commit/d08563486e06df3ddb4d7c1018d1e1e762690ee8.diff

LOG: [clangd] Make Notification a little safer.

I just fixed a test involving a similar Notification class: 18e6a65bae93a

The pattern (notify() on one thread, wait() and then destroy the Notification
on the other) seems innocuous enough. I'm not sure we actually use it in clangd,
but better safe than sorry.

Added: 
    

Modified: 
    clang-tools-extra/clangd/Threading.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clangd/Threading.cpp b/clang-tools-extra/clangd/Threading.cpp
index 016a90297c32..47c91f449d3f 100644
--- a/clang-tools-extra/clangd/Threading.cpp
+++ b/clang-tools-extra/clangd/Threading.cpp
@@ -20,8 +20,10 @@ void Notification::notify() {
   {
     std::lock_guard<std::mutex> Lock(Mu);
     Notified = true;
+    // Broadcast with the lock held. This ensures that it's safe to destroy
+    // a Notification after wait() returns, even from another thread.
+    CV.notify_all();
   }
-  CV.notify_all();
 }
 
 void Notification::wait() const {


        


More information about the cfe-commits mailing list