[PATCH] D76304: [clangd] Update TUStatus api to accommodate preamble thread

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Mar 17 15:09:39 PDT 2020


sammccall added inline comments.


================
Comment at: clang-tools-extra/clangd/TUScheduler.cpp:161
+/// update.
+class TUStatusManager {
+public:
----------------
nit: "manager" doesn't really explain what this is, and it's used both as the class name and the main description in the comment.

Maybe TUStatusTracker or something - "Threadsafe holder for TUStatus..."


================
Comment at: clang-tools-extra/clangd/TUScheduler.cpp:166
+
+  void setPreambleAction(TUAction A) {
+    std::lock_guard<std::mutex> Lock(StatusMu);
----------------
you could consider a slightly more general version:

```
StatusMgr.update([&](TUStatus &S) {
  S.PreambleAction = Idle;
});
```

it's a bit more wordy at the callsite but it makes the correspondence much more direct.


================
Comment at: clang-tools-extra/clangd/TUScheduler.cpp:198
+
+  mutable std::mutex StatusMu;
+  TUStatus Status;
----------------
why mutable with  no const functions?


================
Comment at: clang-tools-extra/clangd/TUScheduler.cpp:277
       build(std::move(*CurrentReq));
+      bool IsEmpty = false;
+      {
----------------
Seems clearer to do this immediately before blocking?

at the top:

```
if (!NextReq) {
  Lock.unlock();
  StatusManager.setPreambleAction(Idle);
  Lock.lock();
  ReqCV.wait(NextReq || Done);
}
if (Done)
  break;
```


================
Comment at: clang-tools-extra/clangd/TUScheduler.cpp:285
+        StatusManager.setPreambleAction({TUAction::Idle, /*Name=*/""});
+      BuiltFirst.notify();
+      ReqCV.notify_all();
----------------
why this change?


================
Comment at: clang-tools-extra/clangd/TUScheduler.h:104
 struct TUStatus {
-  struct BuildDetails {
-    /// Indicates whether clang failed to build the TU.
-    bool BuildFailed = false;
-    /// Indicates whether we reused the prebuilt AST.
-    bool ReuseAST = false;
+  enum BuildStatus {
+    /// Haven't run a built yet
----------------
What's the purpose of this change? It seems to make the build details harder to maintain/extend.

(In particular, say we were going to add a "fallback command was used" bit, where would it go after this change?)


================
Comment at: clang-tools-extra/clangd/TUScheduler.h:117
 
-  TUAction Action;
-  BuildDetails Details;
+  TUAction PreambleAction;
+  TUAction ASTAction;
----------------
why TUAction rather than a PreambleAction enum { Building, Idle }?
It seems Name will never be used, RunningAction/Queued are not possible etc.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D76304/new/

https://reviews.llvm.org/D76304





More information about the cfe-commits mailing list