From 3f758ab2f45a07e3e77af4f1b32dc876f5a151ad Mon Sep 17 00:00:00 2001 From: Martin Sustrik Date: Thu, 3 Feb 2011 09:59:54 +0100 Subject: [PATCH] Don't use RLIMIT_NOFILES in devpoll_t. The patch allows for running 0MQ on Solaris and HP-UX even though ulimit for max number of file descriptors is set to unlimited. Signed-off-by: Martin Sustrik --- src/devpoll.cpp | 20 ++++++++++---------- src/devpoll.hpp | 3 ++- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/devpoll.cpp b/src/devpoll.cpp index 95923c96..61409adc 100644 --- a/src/devpoll.cpp +++ b/src/devpoll.cpp @@ -23,7 +23,6 @@ #include #include -#include #include #include #include @@ -40,15 +39,6 @@ zmq::devpoll_t::devpoll_t () : stopping (false) { - // Get limit on open files - struct 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].valid = false; - devpoll_fd = open ("/dev/poll", O_RDWR); errno_assert (devpoll_fd != -1); } @@ -69,6 +59,16 @@ void zmq::devpoll_t::devpoll_ctl (fd_t fd_, short events_) zmq::devpoll_t::handle_t zmq::devpoll_t::add_fd (fd_t fd_, i_poll_events *reactor_) { + // 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].valid = false; + ++sz; + } + } + assert (!fd_table [fd_].valid); fd_table [fd_].events = 0; diff --git a/src/devpoll.hpp b/src/devpoll.hpp index 84ec222f..81aa3581 100644 --- a/src/devpoll.hpp +++ b/src/devpoll.hpp @@ -73,7 +73,8 @@ namespace zmq bool accepted; }; - std::vector fd_table; + typedef std::vector fd_table_t; + fd_table_t fd_table; typedef std::vector pending_list_t; pending_list_t pending_list;