ilya-biryukov added a comment.

In https://reviews.llvm.org/D51475#1219184, @ioeric wrote:

> The index loading can be slow. When using LLVM YAML index, I need to wait for 
> >10s before clangd starts giving me anything useful. We could potentially 
> speed up loading (e.g. replacing yaml), but the index can be arbitrary large. 
> I think it's an improvement in general to be able to get clangd running 
> before index is loaded.


I would trade-off those 10 seconds for giving consistent experience (i.e. 
avoiding confusing the users with different modes of completion (with and 
without index, etc.)).
But not terribly opposed to that.



================
Comment at: clangd/tool/ClangdMain.cpp:86
+      return nullptr;
+    Index = AsyncLoad.get();
+    return Index.get();
----------------
ioeric wrote:
> ilya-biryukov wrote:
> > I believe is a data race (multiple threads may run this line concurrently).
> > You would want some synchronization around this, `std::shared_future` could 
> > be a good fit
> Nice catch. 
> 
> I am a bit hesitated about using `shared_future` though. It could potentially 
> get rid of the mutex but would require much more careful use. For example, 
> `Index` can be set to the same value repeatedly, which makes me a bit nervous.
The following pattern should give proper results:
```
class AsyncIndex : public Index {
public:
  AsyncIndex(std::shared_future<Index> IndexFut);
  //....
private;
  const SymbolIndex *index() const {
     if (IndexFut.wait(0) != ready)
       return nullptr;
     return &IndexFut.get();
  }

  std::shared_future<Index>IndexFut;
};


AsyncIndex AI(std::async([]() { /* load the index here */ return Index; });
```


Repository:
  rCTE Clang Tools Extra

https://reviews.llvm.org/D51475



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

Reply via email to