ioeric added a comment.

In https://reviews.llvm.org/D51475#1219197, @ilya-biryukov wrote:

> 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.


I think the inconsistency is benign and should be worth 10 seconds (which for 
me personally is loong...). Besides, this is just LLVM index; the loading could 
be arbitrary long depending on the corpus size.



================
Comment at: clangd/tool/ClangdMain.cpp:86
+      return nullptr;
+    Index = AsyncLoad.get();
+    return Index.get();
----------------
ilya-biryukov wrote:
> 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; });
> ```
My concern with this approach is that we are still calling `wait` even though 
it's not necessary once Index has been loaded.


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