From ca1acc340c256a35f0db58805bba7cb337d9a5a3 Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Thu, 3 Feb 2011 08:46:04 +0100 Subject: [PATCH] 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 --- src/poll.cpp | 20 ++++++++++---------- src/poll.hpp | 3 ++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/poll.cpp b/src/poll.cpp index 5ef2ebeb..acf9a6ef 100644 --- a/src/poll.cpp +++ b/src/poll.cpp @@ -27,7 +27,6 @@ #include #include -#include #include #include @@ -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 bc5fb5c1..82713dbd 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_table; + typedef std::vector fd_table_t; + fd_table_t fd_table; // Pollset to pass to the poll function. typedef std::vector pollset_t;