summaryrefslogtreecommitdiffstats
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
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
-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