summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2011-02-03 08:46:04 +0100
committerMartin Sustrik <sustrik@250bpm.com>2011-02-03 08:46:04 +0100
commitca1acc340c256a35f0db58805bba7cb337d9a5a3 (patch)
treebd9f55ea6e1008c5ebd98892bc5b128d4bcfef73 /src
parent1e0302633ea10766d21b2a70d62e6f16440c18d4 (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.cpp20
-rw-r--r--src/poll.hpp3
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;