ilya-biryukov added inline comments.

================
Comment at: clangd/Threading.h:60
+/// A point in time we may wait for, or None to wait forever.
+/// (We use Optional because buggy implementations of std::chrono overflow...)
+using Deadline = llvm::Optional<std::chrono::steady_clock::time_point>;
----------------
Maybe remove the comment or add more context (i.e. add references) on why the 
overflow is buggy?


================
Comment at: clangd/Threading.h:66
+template <typename Func>
+LLVM_NODISCARD bool wait(std::mutex &Mutex, std::condition_variable &CV,
+                         Deadline D, Func F) {
----------------
Maybe move this helper to .cpp file?


================
Comment at: clangd/Threading.h:68
+                         Deadline D, Func F) {
+  std::unique_lock<std::mutex> Lock(Mutex);
+  if (D)
----------------
Maybe keep the locking part out of this helper? It's often desirable to hold 
the lock after `wait()`. This will model how `std::condition_variable::wait` is 
defined. 


================
Comment at: clangd/Threading.h:83
 
-  void waitForAll();
+  bool waitForAll(Deadline D = llvm::None) const;
   void runAsync(UniqueFunction<void()> Action);
----------------
Add `LLVM_NODICARD` here?
For that particular method maybe we could have two overload: with and without 
the deadline, i.e.
```
  void waitForAll() const;
  LLVM_NODISCARD bool waitForAll(Deadline D) const;
```

There are places (like the destructor of this class) where the first overload 
is used and consuming the return value is just adding noise, but clients 
passing the deadline (e.g. `blockUntilIdle()`) should definitely consume the 
return value.


================
Comment at: unittests/clangd/ClangdTests.cpp:784
   class NoConcurrentAccessDiagConsumer : public DiagnosticsConsumer {
-  public:
-    NoConcurrentAccessDiagConsumer(std::promise<void> StartSecondReparse)
-        : StartSecondReparse(std::move(StartSecondReparse)) {}
-
-    void onDiagnosticsReady(
-        PathRef File,
-        Tagged<std::vector<DiagWithFixIts>> Diagnostics) override {
+    std::atomic<bool> InCallback = {false};
 
----------------
Do we need to change this test?
It was specifically designed to keep the second request from overriding the 
first one before it was processed.


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D43127



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to