diff options
author | Pavel Labath <labath@google.com> | 2015-10-27 09:23:55 +0000 |
---|---|---|
committer | Pavel Labath <labath@google.com> | 2015-10-27 09:23:55 +0000 |
commit | 9e131f7fefc6f62ed2d0e8b7c5615c7bb9c69131 (patch) | |
tree | b7b89bdca1619363e2667874398a38d067ea7b74 /lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp | |
parent | 891c0973df532c726d2eb7a5a02cde6b8320adbd (diff) | |
download | bcm5719-llvm-9e131f7fefc6f62ed2d0e8b7c5615c7bb9c69131.tar.gz bcm5719-llvm-9e131f7fefc6f62ed2d0e8b7c5615c7bb9c69131.zip |
Fix race condition in process resume
Summary:
Gdb-remote's async thread sent out the eBroadcastBitRunPacketSent message *before* actually
sending out the continue packet. Since it's this message the actually triggers the public state
transition, it could happen (and it did happen in TestAttachResume, which does an "process
interrupt" right after a continue) that we attempt to stop the inferior before it was actually
started (which obviously did not end well). This fixes the problem by moving the broadcast after
the packet was actually sent.
Reviewers: clayborg
Subscribers: lldb-commits
Differential Revision: http://reviews.llvm.org/D14083
llvm-svn: 251399
Diffstat (limited to 'lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp')
-rw-r--r-- | lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp index a6fcd14cba4..98820aa73ad 100644 --- a/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp +++ b/lldb/source/Plugins/Process/gdb-remote/GDBRemoteCommunicationClient.cpp @@ -1049,7 +1049,6 @@ GDBRemoteCommunicationClient::SendContinuePacketAndWaitForResponse Mutex::Locker locker(m_sequence_mutex); StateType state = eStateRunning; - BroadcastEvent(eBroadcastBitRunPacketSent, NULL); m_public_is_running.SetValue (true, eBroadcastNever); // Set the starting continue packet into "continue_packet". This packet // may change if we are interrupted and we continue after an async packet... @@ -1059,6 +1058,7 @@ GDBRemoteCommunicationClient::SendContinuePacketAndWaitForResponse const auto sigint_signo = process->GetUnixSignals()->GetSignalNumberFromName("SIGINT"); bool got_async_packet = false; + bool broadcast_sent = false; while (state == eStateRunning) { @@ -1071,6 +1071,12 @@ GDBRemoteCommunicationClient::SendContinuePacketAndWaitForResponse else m_interrupt_sent = false; + if (! broadcast_sent) + { + BroadcastEvent(eBroadcastBitRunPacketSent, NULL); + broadcast_sent = true; + } + m_private_is_running.SetValue (true, eBroadcastAlways); } |