Skip to content

Commit

Permalink
[clangd] Fix threading bugs in (not-yet-used) BackgroundIndex, re-ena…
Browse files Browse the repository at this point in the history
…ble test.

Summary:
One relatively boring bug: forgot to notify the CV after enqueue.

One much more fun bug: the thread member could access instance variables before
they were initialized. Although the thread was last in the init list, QueueCV
etc were listed after Thread in the class, so their default constructors raced
with the thread itself.
We have to get very unlucky to lose this race, I saw it 0.02% of the time.

Reviewers: ioeric

Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, jfb, cfe-commits

Differential Revision: https://reviews.llvm.org/D53313

llvm-svn: 344595
  • Loading branch information
sam-mccall committed Oct 16, 2018
1 parent 96f2489 commit bca624a
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 6 deletions.
7 changes: 5 additions & 2 deletions clang-tools-extra/clangd/index/Background.cpp
Expand Up @@ -75,8 +75,11 @@ void BackgroundIndex::blockUntilIdleForTest() {

void BackgroundIndex::enqueue(StringRef Directory,
tooling::CompileCommand Cmd) {
std::lock_guard<std::mutex> Lock(QueueMu);
enqueueLocked(std::move(Cmd));
{
std::lock_guard<std::mutex> Lock(QueueMu);
enqueueLocked(std::move(Cmd));
}
QueueCV.notify_all();
}

void BackgroundIndex::enqueueAll(StringRef Directory,
Expand Down
2 changes: 1 addition & 1 deletion clang-tools-extra/clangd/index/Background.h
Expand Up @@ -65,12 +65,12 @@ class BackgroundIndex : public SwapIndex {
using Task = std::function<void()>; // FIXME: use multiple worker threads.
void run(); // Main loop executed by Thread. Runs tasks from Queue.
void enqueueLocked(tooling::CompileCommand Cmd);
std::thread Thread;
std::mutex QueueMu;
unsigned NumActiveTasks = 0; // Only idle when queue is empty *and* no tasks.
std::condition_variable QueueCV;
bool ShouldStop = false;
std::deque<Task> Queue;
std::thread Thread; // Must be last, spawned thread reads instance vars.
};

} // namespace clangd
Expand Down
3 changes: 0 additions & 3 deletions clang-tools-extra/unittests/clangd/BackgroundIndexTests.cpp
Expand Up @@ -11,8 +11,6 @@ namespace clangd {

MATCHER_P(Named, N, "") { return arg.Name == N; }

// Temporarily disabled: test timing out on buildbots.
#if 0
TEST(BackgroundIndexTest, IndexTwoFiles) {
MockFSProvider FS;
// a.h yields different symbols when included by A.cc vs B.cc.
Expand All @@ -34,7 +32,6 @@ TEST(BackgroundIndexTest, IndexTwoFiles) {
EXPECT_THAT(runFuzzyFind(Idx, ""),
UnorderedElementsAre(Named("a_h"), Named("foo"), Named("bar")));
}
#endif

} // namespace clangd
} // namespace clang

0 comments on commit bca624a

Please sign in to comment.