Module: check_mk
Branch: master
Commit: 2a295cb76b4bb02c7bea1caed1895f0c6b420934
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=2a295cb76b4bb0…
Author: Sven Panne <sp(a)mathias-kettner.de>
Date: Tue Jul 11 13:48:13 2017 +0200
Encapsulate select() calls, part 6
Move file descriptor sets into Poller class, which is a purely mechanical
change. Note that Poller::readFDs() and Poller::writeFDs() return pointers
to internal fields, which is an anti-pattern. This is OK for now, those
methods will die soon, anyway...
Change-Id: If27905c11abd326ab3d28793ce3f208c454902e0
---
livestatus/src/InputBuffer.cc | 9 ++++-----
livestatus/src/OutputBuffer.cc | 9 ++++-----
livestatus/src/Poller.h | 12 +++++++++---
livestatus/src/module.cc | 9 ++++-----
livestatus/src/unixcat.cc | 7 +++----
5 files changed, 24 insertions(+), 22 deletions(-)
diff --git a/livestatus/src/InputBuffer.cc b/livestatus/src/InputBuffer.cc
index 4134ba1..058797a 100644
--- a/livestatus/src/InputBuffer.cc
+++ b/livestatus/src/InputBuffer.cc
@@ -206,12 +206,11 @@ InputBuffer::Result InputBuffer::readData() {
}
Poller poller;
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(_fd, &fds);
+ FD_ZERO(poller.readFDs());
+ FD_SET(_fd, poller.readFDs());
- int retval = poller.poll(_fd + 1, &fds, nullptr, milliseconds(200));
- if (retval > 0 && FD_ISSET(_fd, &fds)) {
+ int retval = poller.poll(_fd + 1, milliseconds(200));
+ if (retval > 0 && FD_ISSET(_fd, poller.readFDs())) {
ssize_t r = read(_fd, &_readahead_buffer[_write_index],
_readahead_buffer.capacity() - _write_index);
if (r < 0) {
diff --git a/livestatus/src/OutputBuffer.cc b/livestatus/src/OutputBuffer.cc
index 5189729..5af8f4e 100644
--- a/livestatus/src/OutputBuffer.cc
+++ b/livestatus/src/OutputBuffer.cc
@@ -79,12 +79,11 @@ void OutputBuffer::writeData(ostringstream &os) {
size_t bytes_to_write = os.tellp();
while (!_termination_flag && bytes_to_write > 0) {
Poller poller;
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(_fd, &fds);
+ FD_ZERO(poller.writeFDs());
+ FD_SET(_fd, poller.writeFDs());
- int retval = poller.poll(_fd + 1, nullptr, &fds, milliseconds(100));
- if (retval > 0 && FD_ISSET(_fd, &fds)) {
+ int retval = poller.poll(_fd + 1, milliseconds(100));
+ if (retval > 0 && FD_ISSET(_fd, poller.writeFDs())) {
ssize_t bytes_written = write(_fd, buffer, bytes_to_write);
if (bytes_written == -1) {
generic_error ge("could not write " +
diff --git a/livestatus/src/Poller.h b/livestatus/src/Poller.h
index 9484ce1..6c5dd50 100644
--- a/livestatus/src/Poller.h
+++ b/livestatus/src/Poller.h
@@ -35,8 +35,7 @@ public:
Poller() {}
template <typename Rep, typename Period>
- int poll(int nfds, fd_set *readfds, fd_set *writefds,
- std::chrono::duration<Rep, Period> timeout) {
+ int poll(int nfds, std::chrono::duration<Rep, Period> timeout) {
int retval;
timeval tv = to_timeval(timeout);
// I/O primitives can fail when interrupted by a signal, so we should
@@ -44,10 +43,17 @@ public:
// encapsulated in e.g. glibc's TEMP_FAILURE_RETRY macro, see:
//
https://www.gnu.org/software/libc/manual/html_node/Interrupted-Primitives.h…
do {
- retval = select(nfds, readfds, writefds, nullptr, &tv);
+ retval = select(nfds, &_readfds, &_writefds, nullptr, &tv);
} while (retval == -1 && errno == EINTR);
return retval;
}
+
+ fd_set *readFDs() { return &_readfds; }
+ fd_set *writeFDs() { return &_writefds; }
+
+private:
+ fd_set _readfds;
+ fd_set _writefds;
};
#endif // Poller_h
diff --git a/livestatus/src/module.cc b/livestatus/src/module.cc
index 3632e52..599cc43 100644
--- a/livestatus/src/module.cc
+++ b/livestatus/src/module.cc
@@ -202,12 +202,11 @@ void *main_thread(void *data) {
do_statistics();
Poller poller;
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(g_unix_socket, &fds);
+ FD_ZERO(poller.readFDs());
+ FD_SET(g_unix_socket, poller.readFDs());
int retval =
- poller.poll(g_unix_socket + 1, &fds, nullptr, milliseconds(2500));
- if (retval > 0 && FD_ISSET(g_unix_socket, &fds)) {
+ poller.poll(g_unix_socket + 1, milliseconds(2500));
+ if (retval > 0 && FD_ISSET(g_unix_socket, poller.readFDs())) {
int cc = accept(g_unix_socket, nullptr, nullptr);
if (cc > g_max_fd_ever) {
g_max_fd_ever = cc;
diff --git a/livestatus/src/unixcat.cc b/livestatus/src/unixcat.cc
index 62c1b7a..7fefd98 100644
--- a/livestatus/src/unixcat.cc
+++ b/livestatus/src/unixcat.cc
@@ -61,10 +61,9 @@ void printErrno(const string &msg) {
ssize_t read_with_timeout(int from, char *buffer, int size,
microseconds timeout) {
Poller poller;
- fd_set fds;
- FD_ZERO(&fds);
- FD_SET(from, &fds);
- int retval = poller.poll(from + 1, &fds, nullptr, timeout);
+ FD_ZERO(poller.readFDs());
+ FD_SET(from, poller.readFDs());
+ int retval = poller.poll(from + 1, timeout);
if (retval > 0) {
return read(from, buffer, size);
}