[PATCH] D43127: [clangd] Stop exposing Futures from ClangdServer operations.

Ilya Biryukov via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 12 04:47:34 PST 2018


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





More information about the cfe-commits mailing list