summaryrefslogtreecommitdiffstats
path: root/lldb
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2019-08-27 01:34:16 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2019-08-27 01:34:16 +0000
commitece176e0f6a9a3760358001fb39b308c8ffc5edc (patch)
tree5dc89d1aaf07d19deb8e65f3ee46250933a301bf /lldb
parent25abd0ebddc21e4452bbbb401c335979d5a45c42 (diff)
downloadbcm5719-llvm-ece176e0f6a9a3760358001fb39b308c8ffc5edc.tar.gz
bcm5719-llvm-ece176e0f6a9a3760358001fb39b308c8ffc5edc.zip
[ConnectionFileDescriptor] Add shutdown check in ::Write.
The disconnect method sets the shutdown flag to true. This currently only prevents any reads from happening, but not writes, which is incorrect. Presumably this was just an oversight when adding synchronization to the class. This adds the same shutdown check to the Write method. Over-the-shoulder reviewed by Jim! llvm-svn: 370002
Diffstat (limited to 'lldb')
-rw-r--r--lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
index fb88428eaca..a8425638555 100644
--- a/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
+++ b/lldb/source/Host/posix/ConnectionFileDescriptorPosix.cpp
@@ -312,9 +312,6 @@ ConnectionStatus ConnectionFileDescriptor::Disconnect(Status *error_ptr) {
// descriptor. If that's the case, then send the "q" char to the command
// file channel so the read will wake up and the connection will then know to
// shut down.
-
- m_shutting_down = true;
-
std::unique_lock<std::recursive_mutex> locker(m_mutex, std::defer_lock);
if (!locker.try_lock()) {
if (m_pipe.CanWrite()) {
@@ -334,6 +331,9 @@ ConnectionStatus ConnectionFileDescriptor::Disconnect(Status *error_ptr) {
locker.lock();
}
+ // Prevents reads and writes during shutdown.
+ m_shutting_down = true;
+
Status error = m_read_sp->Close();
Status error2 = m_write_sp->Close();
if (error.Fail() || error2.Fail())
@@ -369,6 +369,8 @@ size_t ConnectionFileDescriptor::Read(void *dst, size_t dst_len,
}
if (m_shutting_down) {
+ if (error_ptr)
+ error_ptr->SetErrorString("shutting down");
status = eConnectionStatusError;
return 0;
}
@@ -473,6 +475,13 @@ size_t ConnectionFileDescriptor::Write(const void *src, size_t src_len,
return 0;
}
+ if (m_shutting_down) {
+ if (error_ptr)
+ error_ptr->SetErrorString("shutting down");
+ status = eConnectionStatusError;
+ return 0;
+ }
+
Status error;
size_t bytes_sent = src_len;
OpenPOWER on IntegriCloud