[all-commits] [llvm/llvm-project] ebb071: [lldb/Core] Fix a race in the Communication class
Pavel Labath via All-commits
all-commits at lists.llvm.org
Thu Apr 9 03:08:11 PDT 2020
Branch: refs/heads/master
Home: https://github.com/llvm/llvm-project
Commit: ebb071345cdae2509c55f9eec76090926fee86a2
https://github.com/llvm/llvm-project/commit/ebb071345cdae2509c55f9eec76090926fee86a2
Author: Pavel Labath <pavel at labath.sk>
Date: 2020-04-09 (Thu, 09 Apr 2020)
Changed paths:
M lldb/source/Core/Communication.cpp
M lldb/unittests/Core/CMakeLists.txt
A lldb/unittests/Core/CommunicationTest.cpp
Log Message:
-----------
[lldb/Core] Fix a race in the Communication class
Summary:
Communication::SynchronizeWithReadThread is called whenever a process
stops to ensure that we process all of its stdout before we report the
stop. If the process exits, we first call this method, and then close
the connection.
However, when the child process exits, the thread reading its stdout
will usually (but not always) read an EOF because the other end of the
pty has been closed. In response to an EOF, the Communication read
thread closes it's end of the connection too.
This can result in a race where the read thread is closing the
connection while the synchronizing thread is attempting to get its
attention via Connection::InterruptRead.
The fix is to hold the synchronization mutex while closing the
connection.
I've found this issue while tracking down a rare flake in some of the
vscode tests. I am not sure this is the cause of those failures (as I
would have expected this issue to manifest itself differently), but it
is an issue nonetheless.
The attached test demonstrates the steps needed to reproduce the race.
It will fail under tsan without this patch.
Reviewers: clayborg, JDevlieghere
Subscribers: mgorny, lldb-commits
Tags: #lldb
Differential Revision: https://reviews.llvm.org/D77295
More information about the All-commits
mailing list