diff options
author | Martin Sustrik <sustrik@250bpm.com> | 2011-02-03 08:46:04 +0100 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2011-02-03 08:46:04 +0100 |
commit | ca1acc340c256a35f0db58805bba7cb337d9a5a3 (patch) | |
tree | bd9f55ea6e1008c5ebd98892bc5b128d4bcfef73 /src | |
parent | 1e0302633ea10766d21b2a70d62e6f16440c18d4 (diff) |
RLIMIT_NOFILE not used in poll_t anymore
The problem was that RLIMIT_NOFILE can be set to RLIM_INIFINITY
(and that appears to be default on AIX) which caused 0MQ to fail.
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/poll.cpp | 20 | ||||
-rw-r--r-- | src/poll.hpp | 3 |
2 files changed, 12 insertions, 11 deletions
diff --git a/src/poll.cpp b/src/poll.cpp index 5ef2ebe..acf9a6e 100644 --- a/src/poll.cpp +++ b/src/poll.cpp @@ -27,7 +27,6 @@ #include <sys/types.h> #include <sys/time.h> -#include <sys/resource.h> #include <poll.h> #include <algorithm> @@ -40,15 +39,6 @@ zmq::poll_t::poll_t () : retired (false), stopping (false) { - // Get the limit on open file descriptors. Resize fds so that it - // can hold all descriptors. - rlimit rl; - int rc = getrlimit (RLIMIT_NOFILE, &rl); - errno_assert (rc != -1); - fd_table.resize (rl.rlim_cur); - - for (rlim_t i = 0; i < rl.rlim_cur; i ++) - fd_table [i].index = retired_fd; } zmq::poll_t::~poll_t () @@ -58,6 +48,16 @@ zmq::poll_t::~poll_t () zmq::poll_t::handle_t zmq::poll_t::add_fd (fd_t fd_, i_poll_events *events_) { + // If the file descriptor table is too small expand it. + fd_table_t::size_type sz = fd_table.size (); + if (sz <= (fd_table_t::size_type) fd_) { + fd_table.resize (fd_ + 1); + while (sz != (fd_table_t::size_type) (fd_ + 1)) { + fd_table [sz].index = retired_fd; + ++sz; + } + } + pollfd pfd = {fd_, 0, 0}; pollset.push_back (pfd); assert (fd_table [fd_].index == retired_fd); diff --git a/src/poll.hpp b/src/poll.hpp index bc5fb5c..82713db 100644 --- a/src/poll.hpp +++ b/src/poll.hpp @@ -76,7 +76,8 @@ namespace zmq }; // This table stores data for registered descriptors. - std::vector <fd_entry_t> fd_table; + typedef std::vector <fd_entry_t> fd_table_t; + fd_table_t fd_table; // Pollset to pass to the poll function. typedef std::vector <pollfd> pollset_t; |