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.cpp73
1 files changed, 41 insertions, 32 deletions
diff --git a/lldb/source/Utility/SelectHelper.cpp b/lldb/source/Utility/SelectHelper.cpp
index cd9a0f6e68b..805bcf2c795 100644
--- a/lldb/source/Utility/SelectHelper.cpp
+++ b/lldb/source/Utility/SelectHelper.cpp
@@ -45,13 +45,19 @@ void SelectHelper::SetTimeout(const std::chrono::microseconds &timeout) {
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(lldb::socket_t fd) {
+ m_fd_map[fd].read_set = true;
+}
-void SelectHelper::FDSetWrite(int fd) { m_fd_map[fd].write_set = true; }
+void SelectHelper::FDSetWrite(lldb::socket_t fd) {
+ m_fd_map[fd].write_set = true;
+}
-void SelectHelper::FDSetError(int fd) { m_fd_map[fd].error_set = true; }
+void SelectHelper::FDSetError(lldb::socket_t fd) {
+ m_fd_map[fd].error_set = true;
+}
-bool SelectHelper::FDIsSetRead(int fd) const {
+bool SelectHelper::FDIsSetRead(lldb::socket_t fd) const {
auto pos = m_fd_map.find(fd);
if (pos != m_fd_map.end())
return pos->second.read_is_set;
@@ -59,7 +65,7 @@ bool SelectHelper::FDIsSetRead(int fd) const {
return false;
}
-bool SelectHelper::FDIsSetWrite(int fd) const {
+bool SelectHelper::FDIsSetWrite(lldb::socket_t fd) const {
auto pos = m_fd_map.find(fd);
if (pos != m_fd_map.end())
return pos->second.write_is_set;
@@ -67,7 +73,7 @@ bool SelectHelper::FDIsSetWrite(int fd) const {
return false;
}
-bool SelectHelper::FDIsSetError(int fd) const {
+bool SelectHelper::FDIsSetError(lldb::socket_t fd) const {
auto pos = m_fd_map.find(fd);
if (pos != m_fd_map.end())
return pos->second.error_is_set;
@@ -75,6 +81,14 @@ bool SelectHelper::FDIsSetError(int fd) const {
return false;
}
+static void updateMaxFd(llvm::Optional<lldb::socket_t> &vold,
+ lldb::socket_t vnew) {
+ if (!vold.hasValue())
+ vold = vnew;
+ else
+ vold = std::max(*vold, vnew);
+}
+
lldb_private::Error SelectHelper::Select() {
lldb_private::Error error;
#ifdef _MSC_VER
@@ -85,13 +99,13 @@ lldb_private::Error SelectHelper::Select() {
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;
+ llvm::Optional<lldb::socket_t> max_read_fd;
+ llvm::Optional<lldb::socket_t> max_write_fd;
+ llvm::Optional<lldb::socket_t> max_error_fd;
+ llvm::Optional<lldb::socket_t> max_fd;
for (auto &pair : m_fd_map) {
pair.second.PrepareForSelect();
- const int fd = pair.first;
+ const lldb::socket_t fd = pair.first;
#if !defined(__APPLE__) && !defined(_MSC_VER)
lldbassert(fd < FD_SETSIZE);
if (fd >= FD_SETSIZE) {
@@ -99,26 +113,21 @@ lldb_private::Error SelectHelper::Select() {
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)
+ updateMaxFd(max_read_fd, fd);
+ if (pair.second.write_set)
+ updateMaxFd(max_write_fd, fd);
+ if (pair.second.error_set)
+ updateMaxFd(max_error_fd, fd);
+ updateMaxFd(max_fd, fd);
}
- if (max_fd == -1) {
+ if (!max_fd.hasValue()) {
error.SetErrorString("no valid file descriptors");
return error;
}
- const int nfds = max_fd + 1;
+ const unsigned nfds = static_cast<unsigned>(*max_fd) + 1;
fd_set *read_fdset_ptr = nullptr;
fd_set *write_fdset_ptr = nullptr;
fd_set *error_fdset_ptr = nullptr;
@@ -130,15 +139,15 @@ lldb_private::Error SelectHelper::Select() {
llvm::SmallVector<fd_set, 1> write_fdset;
llvm::SmallVector<fd_set, 1> error_fdset;
- if (max_read_fd >= 0) {
+ if (max_read_fd.hasValue()) {
read_fdset.resize((nfds / FD_SETSIZE) + 1);
read_fdset_ptr = read_fdset.data();
}
- if (max_write_fd >= 0) {
+ if (max_write_fd.hasValue()) {
write_fdset.resize((nfds / FD_SETSIZE) + 1);
write_fdset_ptr = write_fdset.data();
}
- if (max_error_fd >= 0) {
+ if (max_error_fd.hasValue()) {
error_fdset.resize((nfds / FD_SETSIZE) + 1);
error_fdset_ptr = error_fdset.data();
}
@@ -153,15 +162,15 @@ lldb_private::Error SelectHelper::Select() {
fd_set write_fdset;
fd_set error_fdset;
- if (max_read_fd >= 0) {
+ if (max_read_fd.hasValue()) {
FD_ZERO(&read_fdset);
read_fdset_ptr = &read_fdset;
}
- if (max_write_fd >= 0) {
+ if (max_write_fd.hasValue()) {
FD_ZERO(&write_fdset);
write_fdset_ptr = &write_fdset;
}
- if (max_error_fd >= 0) {
+ if (max_error_fd.hasValue()) {
FD_ZERO(&error_fdset);
error_fdset_ptr = &error_fdset;
}
@@ -170,7 +179,7 @@ lldb_private::Error SelectHelper::Select() {
// Set the FD bits in the fdsets for read/write/error
//----------------------------------------------------------------------
for (auto &pair : m_fd_map) {
- const int fd = pair.first;
+ const lldb::socket_t fd = pair.first;
if (pair.second.read_set)
FD_SET(fd, read_fdset_ptr);
OpenPOWER on IntegriCloud