kadircet added a comment. There seems to be no unexpected changes after rebase
================ Comment at: clangd/index/Background.cpp:259 + // if this thread sees the older version but finishes later. This should + // be rare in practice. + DigestIt.first->second = Hash; ---------------- ilya-biryukov wrote: > kadircet wrote: > > ilya-biryukov wrote: > > > kadircet wrote: > > > > ilya-biryukov wrote: > > > > > > "should be rare in practice" > > > > > And yet, can we avoid this altogether? > > > > > > > > > > Also, I believe it won't be rare. When processing multiple different > > > > > TUs, we can easily run into the same header multiple times, possibly > > > > > with the different contents. > > > > > E.g. imagine the index for the whole of clang is being built and the > > > > > user is editing `Sema.h` at the same time. We'll definitely be > > > > > running into this case over and over again. > > > > Well I am open to ideas, but currently there is no way of knowing > > > > whether this is the newer version for the file. Because only > > > > information we have is the digest is different than what we currently > > > > have and this doesn't yield any chronological information. > > > Do we know which request is "newer" when scheduling it? > > > If so, we could keep the map of the **latest** hashes of the files we've > > > seen (in addition to the `IndexedFileDigests`, which correspond to the > > > digest for which we built the index IIUC). > > > > > > This would give us a simple invariant of the final state we want to bring > > > the index to: `IndexedFileDigests` should correspond to the latest hashes > > > seen so far. If not, we have to rebuild the index for the corresponding > > > files. That, in turn, gives us a way to resolve conflicts: we should > > > never replace with symbols built for the latest version (hash) of the > > > file we've seen. > > > > > > Would that work? > > I am not sure if it would work for non-main files. We update the Hash for > > the main files at each indexing action, so we can safely keep track of the > > latest versions. But we collect hashes for dependencies while performing > > the indexing which happens in parallel. Therefore an indexing action > > triggered earlier might get an up-to-date version of a dependency than an > > action triggered later-on. > If updates for each TU are atomic (i.e. all files included in the TU are > updated in a single go) we would get the up-to-date index eventually, > assuming we rebuild the index when TU dependencies change (we don't schedule > rebuilds on changes to included header now, but we're planning to do so at > some point). Sure, that assumption seems more relaxed than the previous one, just wanna make sure I got it right: Your suggested solution assumes: Dependencies of a TU won't change during indexing of that TU Whereas the previous assumption was: Files won't change between close indexing actions ================ Comment at: clangd/index/Background.cpp:197 + Cmd.CommandLine.push_back("-resource-dir=" + ResourceDir); + const std::string FileName = Cmd.Filename; + if (auto Error = index(std::move(Cmd), Storage)) ---------------- ilya-biryukov wrote: > use `llvm::StringRef` If the command fails we want to show the filename but we are moving the Cmd, so we need to keep a copy of the filename. ================ Comment at: clangd/index/Background.h:111 + bool NeedsReIndexing; + Source(llvm::StringRef Path, bool NeedsReIndexing = true) + : Path(Path), NeedsReIndexing(NeedsReIndexing) {} ---------------- ilya-biryukov wrote: > NIT: maybe remove the constructor? plain structs can easily be initialized > with init lists and adding a constructor forbids per-field assignment, which > is a bit nicer in some cases. > Not very important, since it's a private API, but still. Once I assign a default value for NeedsReIndexing, I cannot construct Source objects with init lists, therefore I've added a constructor instead. Repository: rCTE Clang Tools Extra CHANGES SINCE LAST ACTION https://reviews.llvm.org/D55224/new/ https://reviews.llvm.org/D55224 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits