summaryrefslogtreecommitdiffstats
path: root/lldb/source/Utility/SelectHelper.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Utility/SelectHelper.cpp')
-rw-r--r--lldb/source/Utility/SelectHelper.cpp413
1 files changed, 182 insertions, 231 deletions
diff --git a/lldb/source/Utility/SelectHelper.cpp b/lldb/source/Utility/SelectHelper.cpp
index 44282d26a50..cd9a0f6e68b 100644
--- a/lldb/source/Utility/SelectHelper.cpp
+++ b/lldb/source/Utility/SelectHelper.cpp
@@ -32,269 +32,220 @@
// Project includes
#include "lldb/Core/Error.h"
-#include "lldb/Utility/SelectHelper.h"
#include "lldb/Utility/LLDBAssert.h"
+#include "lldb/Utility/SelectHelper.h"
-SelectHelper::SelectHelper() :
- m_fd_map(),
- m_end_time() // Infinite timeout unless SelectHelper::SetTimeout() gets called
-{
-}
+SelectHelper::SelectHelper()
+ : m_fd_map(), m_end_time() // Infinite timeout unless
+ // SelectHelper::SetTimeout() gets called
+{}
-void
-SelectHelper::SetTimeout(const std::chrono::microseconds &timeout)
-{
- using namespace std::chrono;
- m_end_time = steady_clock::time_point(steady_clock::now() + timeout);
+void SelectHelper::SetTimeout(const std::chrono::microseconds &timeout) {
+ using namespace std::chrono;
+ m_end_time = steady_clock::time_point(steady_clock::now() + timeout);
}
-void
-SelectHelper::FDSetRead(int fd)
-{
- m_fd_map[fd].read_set = true;
-}
+void SelectHelper::FDSetRead(int fd) { m_fd_map[fd].read_set = true; }
-void
-SelectHelper::FDSetWrite(int fd)
-{
- m_fd_map[fd].write_set = true;
-}
+void SelectHelper::FDSetWrite(int fd) { m_fd_map[fd].write_set = true; }
-void
-SelectHelper::FDSetError(int fd)
-{
- m_fd_map[fd].error_set = true;
-}
+void SelectHelper::FDSetError(int fd) { m_fd_map[fd].error_set = true; }
-bool
-SelectHelper::FDIsSetRead(int fd) const
-{
- auto pos = m_fd_map.find(fd);
- if (pos != m_fd_map.end())
- return pos->second.read_is_set;
- else
- return false;
+bool SelectHelper::FDIsSetRead(int fd) const {
+ auto pos = m_fd_map.find(fd);
+ if (pos != m_fd_map.end())
+ return pos->second.read_is_set;
+ else
+ return false;
}
-bool
-SelectHelper::FDIsSetWrite(int fd) const
-{
- auto pos = m_fd_map.find(fd);
- if (pos != m_fd_map.end())
- return pos->second.write_is_set;
- else
- return false;
+bool SelectHelper::FDIsSetWrite(int fd) const {
+ auto pos = m_fd_map.find(fd);
+ if (pos != m_fd_map.end())
+ return pos->second.write_is_set;
+ else
+ return false;
}
-bool
-SelectHelper::FDIsSetError(int fd) const
-{
- auto pos = m_fd_map.find(fd);
- if (pos != m_fd_map.end())
- return pos->second.error_is_set;
- else
- return false;
+bool SelectHelper::FDIsSetError(int fd) const {
+ auto pos = m_fd_map.find(fd);
+ if (pos != m_fd_map.end())
+ return pos->second.error_is_set;
+ else
+ return false;
}
-lldb_private::Error
-SelectHelper::Select()
-{
- lldb_private::Error error;
+lldb_private::Error SelectHelper::Select() {
+ lldb_private::Error error;
#ifdef _MSC_VER
- // On windows FD_SETSIZE limits the number of file descriptors, not their numeric value.
- lldbassert(m_fd_map.size() <= FD_SETSIZE);
- if (m_fd_map.size() > FD_SETSIZE)
- return lldb_private::Error("Too many file descriptors for select()");
+ // On windows FD_SETSIZE limits the number of file descriptors, not their
+ // numeric value.
+ lldbassert(m_fd_map.size() <= FD_SETSIZE);
+ if (m_fd_map.size() > FD_SETSIZE)
+ return lldb_private::Error("Too many file descriptors for select()");
#endif
- int max_read_fd = -1;
- int max_write_fd = -1;
- int max_error_fd = -1;
- int max_fd = -1;
- for (auto &pair : m_fd_map)
- {
- pair.second.PrepareForSelect();
- const int fd = pair.first;
+ int max_read_fd = -1;
+ int max_write_fd = -1;
+ int max_error_fd = -1;
+ int max_fd = -1;
+ for (auto &pair : m_fd_map) {
+ pair.second.PrepareForSelect();
+ const int fd = pair.first;
#if !defined(__APPLE__) && !defined(_MSC_VER)
- lldbassert(fd < FD_SETSIZE);
- if (fd >= FD_SETSIZE)
- {
- error.SetErrorStringWithFormat("%i is too large for select()", fd);
- return error;
- }
+ lldbassert(fd < FD_SETSIZE);
+ if (fd >= FD_SETSIZE) {
+ error.SetErrorStringWithFormat("%i is too large for select()", fd);
+ return error;
+ }
#endif
- if (pair.second.read_set)
- {
- max_read_fd = std::max<int>(fd, max_read_fd);
- max_fd = std::max<int>(fd, max_fd);
- }
- if (pair.second.write_set)
- {
- max_write_fd = std::max<int>(fd, max_write_fd);
- max_fd = std::max<int>(fd, max_fd);
- }
- if (pair.second.error_set)
- {
- max_error_fd = std::max<int>(fd, max_error_fd);
- max_fd = std::max<int>(fd, max_fd);
- }
+ if (pair.second.read_set) {
+ max_read_fd = std::max<int>(fd, max_read_fd);
+ max_fd = std::max<int>(fd, max_fd);
}
-
- if (max_fd == -1)
- {
- error.SetErrorString("no valid file descriptors");
- return error;
+ if (pair.second.write_set) {
+ max_write_fd = std::max<int>(fd, max_write_fd);
+ max_fd = std::max<int>(fd, max_fd);
+ }
+ if (pair.second.error_set) {
+ max_error_fd = std::max<int>(fd, max_error_fd);
+ max_fd = std::max<int>(fd, max_fd);
}
+ }
- const int nfds = max_fd + 1;
- fd_set *read_fdset_ptr = nullptr;
- fd_set *write_fdset_ptr = nullptr;
- fd_set *error_fdset_ptr = nullptr;
- //----------------------------------------------------------------------
- // Initialize and zero out the fdsets
- //----------------------------------------------------------------------
+ if (max_fd == -1) {
+ error.SetErrorString("no valid file descriptors");
+ return error;
+ }
+
+ const int nfds = max_fd + 1;
+ fd_set *read_fdset_ptr = nullptr;
+ fd_set *write_fdset_ptr = nullptr;
+ fd_set *error_fdset_ptr = nullptr;
+//----------------------------------------------------------------------
+// Initialize and zero out the fdsets
+//----------------------------------------------------------------------
#if defined(__APPLE__)
- llvm::SmallVector<fd_set, 1> read_fdset;
- llvm::SmallVector<fd_set, 1> write_fdset;
- llvm::SmallVector<fd_set, 1> error_fdset;
-
- if (max_read_fd >= 0)
- {
- read_fdset.resize((nfds / FD_SETSIZE) + 1);
- read_fdset_ptr = read_fdset.data();
- }
- if (max_write_fd >= 0)
- {
- write_fdset.resize((nfds / FD_SETSIZE) + 1);
- write_fdset_ptr = write_fdset.data();
- }
- if (max_error_fd >= 0)
- {
- error_fdset.resize((nfds / FD_SETSIZE) + 1);
- error_fdset_ptr = error_fdset.data();
- }
- for (auto &fd_set : read_fdset)
- FD_ZERO(&fd_set);
- for (auto &fd_set : write_fdset)
- FD_ZERO(&fd_set);
- for (auto &fd_set : error_fdset)
- FD_ZERO(&fd_set);
+ llvm::SmallVector<fd_set, 1> read_fdset;
+ llvm::SmallVector<fd_set, 1> write_fdset;
+ llvm::SmallVector<fd_set, 1> error_fdset;
+
+ if (max_read_fd >= 0) {
+ read_fdset.resize((nfds / FD_SETSIZE) + 1);
+ read_fdset_ptr = read_fdset.data();
+ }
+ if (max_write_fd >= 0) {
+ write_fdset.resize((nfds / FD_SETSIZE) + 1);
+ write_fdset_ptr = write_fdset.data();
+ }
+ if (max_error_fd >= 0) {
+ error_fdset.resize((nfds / FD_SETSIZE) + 1);
+ error_fdset_ptr = error_fdset.data();
+ }
+ for (auto &fd_set : read_fdset)
+ FD_ZERO(&fd_set);
+ for (auto &fd_set : write_fdset)
+ FD_ZERO(&fd_set);
+ for (auto &fd_set : error_fdset)
+ FD_ZERO(&fd_set);
#else
- fd_set read_fdset;
- fd_set write_fdset;
- fd_set error_fdset;
-
- if (max_read_fd >= 0)
- {
- FD_ZERO(&read_fdset);
- read_fdset_ptr = &read_fdset;
- }
- if (max_write_fd >= 0)
- {
- FD_ZERO(&write_fdset);
- write_fdset_ptr = &write_fdset;
- }
- if (max_error_fd >= 0)
- {
- FD_ZERO(&error_fdset);
- error_fdset_ptr = &error_fdset;
- }
+ fd_set read_fdset;
+ fd_set write_fdset;
+ fd_set error_fdset;
+
+ if (max_read_fd >= 0) {
+ FD_ZERO(&read_fdset);
+ read_fdset_ptr = &read_fdset;
+ }
+ if (max_write_fd >= 0) {
+ FD_ZERO(&write_fdset);
+ write_fdset_ptr = &write_fdset;
+ }
+ if (max_error_fd >= 0) {
+ FD_ZERO(&error_fdset);
+ error_fdset_ptr = &error_fdset;
+ }
#endif
- //----------------------------------------------------------------------
- // Set the FD bits in the fdsets for read/write/error
- //----------------------------------------------------------------------
- for (auto &pair : m_fd_map)
- {
- const int fd = pair.first;
+ //----------------------------------------------------------------------
+ // Set the FD bits in the fdsets for read/write/error
+ //----------------------------------------------------------------------
+ for (auto &pair : m_fd_map) {
+ const int fd = pair.first;
- if (pair.second.read_set)
- FD_SET(fd, read_fdset_ptr);
+ if (pair.second.read_set)
+ FD_SET(fd, read_fdset_ptr);
- if (pair.second.write_set)
- FD_SET(fd, write_fdset_ptr);
+ if (pair.second.write_set)
+ FD_SET(fd, write_fdset_ptr);
- if (pair.second.error_set)
- FD_SET(fd, error_fdset_ptr);
- }
+ if (pair.second.error_set)
+ FD_SET(fd, error_fdset_ptr);
+ }
- //----------------------------------------------------------------------
- // Setup our timeout time value if needed
- //----------------------------------------------------------------------
- struct timeval *tv_ptr = nullptr;
- struct timeval tv = {0, 0};
+ //----------------------------------------------------------------------
+ // Setup our timeout time value if needed
+ //----------------------------------------------------------------------
+ struct timeval *tv_ptr = nullptr;
+ struct timeval tv = {0, 0};
- while (1)
- {
- using namespace std::chrono;
- //------------------------------------------------------------------
- // Setup out relative timeout based on the end time if we have one
- //------------------------------------------------------------------
- if (m_end_time.hasValue())
- {
- tv_ptr = &tv;
- const auto remaining_dur = duration_cast<microseconds>(m_end_time.getValue() - steady_clock::now());
- if (remaining_dur.count() > 0)
- {
- // Wait for a specific amount of time
- const auto dur_secs = duration_cast<seconds>(remaining_dur);
- const auto dur_usecs = remaining_dur % seconds(1);
- tv.tv_sec = dur_secs.count();
- tv.tv_usec = dur_usecs.count();
- }
- else
- {
- // Just poll once with no timeout
- tv.tv_sec = 0;
- tv.tv_usec = 0;
- }
- }
- const int num_set_fds = ::select(nfds, read_fdset_ptr, write_fdset_ptr, error_fdset_ptr, tv_ptr);
- if (num_set_fds < 0)
- {
- // We got an error
- error.SetErrorToErrno();
- if (error.GetError() == EINTR)
- {
- error.Clear();
- continue; // Keep calling select if we get EINTR
- }
- else
- return error;
+ while (1) {
+ using namespace std::chrono;
+ //------------------------------------------------------------------
+ // Setup out relative timeout based on the end time if we have one
+ //------------------------------------------------------------------
+ if (m_end_time.hasValue()) {
+ tv_ptr = &tv;
+ const auto remaining_dur = duration_cast<microseconds>(
+ m_end_time.getValue() - steady_clock::now());
+ if (remaining_dur.count() > 0) {
+ // Wait for a specific amount of time
+ const auto dur_secs = duration_cast<seconds>(remaining_dur);
+ const auto dur_usecs = remaining_dur % seconds(1);
+ tv.tv_sec = dur_secs.count();
+ tv.tv_usec = dur_usecs.count();
+ } else {
+ // Just poll once with no timeout
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ }
+ }
+ const int num_set_fds = ::select(nfds, read_fdset_ptr, write_fdset_ptr,
+ error_fdset_ptr, tv_ptr);
+ if (num_set_fds < 0) {
+ // We got an error
+ error.SetErrorToErrno();
+ if (error.GetError() == EINTR) {
+ error.Clear();
+ continue; // Keep calling select if we get EINTR
+ } else
+ return error;
+ } else if (num_set_fds == 0) {
+ // Timeout
+ error.SetError(ETIMEDOUT, lldb::eErrorTypePOSIX);
+ error.SetErrorString("timed out");
+ return error;
+ } else {
+ // One or more descriptors were set, update the FDInfo::select_is_set mask
+ // so users can ask the SelectHelper class so clients can call one of:
+
+ for (auto &pair : m_fd_map) {
+ const int fd = pair.first;
+
+ if (pair.second.read_set) {
+ if (FD_ISSET(fd, read_fdset_ptr))
+ pair.second.read_is_set = true;
}
- else if (num_set_fds == 0)
- {
- // Timeout
- error.SetError(ETIMEDOUT, lldb::eErrorTypePOSIX);
- error.SetErrorString("timed out");
- return error;
+ if (pair.second.write_set) {
+ if (FD_ISSET(fd, write_fdset_ptr))
+ pair.second.write_is_set = true;
}
- else
- {
- // One or more descriptors were set, update the FDInfo::select_is_set mask
- // so users can ask the SelectHelper class so clients can call one of:
-
- for (auto &pair : m_fd_map)
- {
- const int fd = pair.first;
-
- if (pair.second.read_set)
- {
- if (FD_ISSET(fd, read_fdset_ptr))
- pair.second.read_is_set = true;
- }
- if (pair.second.write_set)
- {
- if (FD_ISSET(fd, write_fdset_ptr))
- pair.second.write_is_set = true;
- }
- if (pair.second.error_set)
- {
- if (FD_ISSET(fd, error_fdset_ptr))
- pair.second.error_is_set = true;
- }
- }
- break;
+ if (pair.second.error_set) {
+ if (FD_ISSET(fd, error_fdset_ptr))
+ pair.second.error_is_set = true;
}
+ }
+ break;
}
- return error;
+ }
+ return error;
}
OpenPOWER on IntegriCloud