[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 07:39:00 PST 2018
ilya-biryukov added inline comments.
================
Comment at: clangd/TUScheduler.cpp:286
} // unlock Mutex.
RequestsCV.notify_one();
}
----------------
Change to `notify_all()`? Otherwise we might wake up some thread waiting on `blockUntilIdle()`, but not the worker thread.
================
Comment at: clangd/TUScheduler.cpp:314
+ }
+ RequestsCV.notify_one();
}
----------------
We should probably call `notify_all()` here.
Having multiple `blockUntilIdle` might not work otherwise.
================
Comment at: clangd/Threading.h:66
+template <typename Func>
+LLVM_NODISCARD bool wait(std::mutex &Mutex, std::condition_variable &CV,
+ Deadline D, Func F) {
----------------
sammccall wrote:
> ilya-biryukov wrote:
> > Maybe move this helper to .cpp file?
> it's public, and it's a template - what am I missing?
Sorry, I missed that it's used outside Threading.h
================
Comment at: clangd/Threading.h:68
+ Deadline D, Func F) {
+ std::unique_lock<std::mutex> Lock(Mutex);
+ if (D)
----------------
sammccall wrote:
> ilya-biryukov wrote:
> > 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.
> I tried this, but find the API just way too grungy - we need to pass a `unique_lock<std::mutex>&`?
> Generally I'd hope we're aiming for something a little higher level than the standard library!
>
> We don't actually ever need to do anything with the lock held. If we did, what about passing a lambda?
The higher-level abstraction would certainly be appealing to me as well and I would welcome it.
I don't think we get it here, though. It's actually a bit confusing that the function calls into STL's versions of wait and wait_until, has a similar name, but does a slightly different thing.
================
Comment at: unittests/clangd/ClangdTests.cpp:783
public:
- NoConcurrentAccessDiagConsumer(std::promise<void> StartSecondReparse)
- : StartSecondReparse(std::move(StartSecondReparse)) {}
+ std::atomic<int> Count = {0};
----------------
Maybe use paren initializers? Looks a bit less curly :-)
```
std::atomic<int> Count(0);
```
Repository:
rCTE Clang Tools Extra
https://reviews.llvm.org/D43127
More information about the cfe-commits
mailing list