diff options
| author | Martin Lucina <martin@lucina.net> | 2012-01-23 08:53:35 +0100 | 
|---|---|---|
| committer | Martin Lucina <martin@lucina.net> | 2012-01-23 08:53:35 +0100 | 
| commit | e645fc2693acc796304498909786b7b47005b429 (patch) | |
| tree | 4118cd4c7b9eba3ba1d6892800c79669ea94c4e9 /src/devpoll.cpp | |
| parent | 2c416a793ea781273a5da6742211f5f01af13a2b (diff) | |
Imported Upstream version 2.1.3upstream/2.1.3
Diffstat (limited to 'src/devpoll.cpp')
| -rw-r--r-- | src/devpoll.cpp | 86 | 
1 files changed, 27 insertions, 59 deletions
diff --git a/src/devpoll.cpp b/src/devpoll.cpp index 003f465..25763c6 100644 --- a/src/devpoll.cpp +++ b/src/devpoll.cpp @@ -1,19 +1,20 @@  /* -    Copyright (c) 2007-2010 iMatix Corporation +    Copyright (c) 2007-2011 iMatix Corporation +    Copyright (c) 2007-2011 Other contributors as noted in the AUTHORS file      This file is part of 0MQ.      0MQ is free software; you can redistribute it and/or modify it under -    the terms of the Lesser GNU General Public License as published by +    the terms of the GNU Lesser General Public License as published by      the Free Software Foundation; either version 3 of the License, or      (at your option) any later version.      0MQ is distributed in the hope that it will be useful,      but WITHOUT ANY WARRANTY; without even the implied warranty of      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -    Lesser GNU General Public License for more details. +    GNU Lesser General Public License for more details. -    You should have received a copy of the Lesser GNU General Public License +    You should have received a copy of the GNU Lesser General Public License      along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ @@ -23,7 +24,6 @@  #include <sys/devpoll.h>  #include <sys/time.h> -#include <sys/resource.h>  #include <sys/types.h>  #include <sys/stat.h>  #include <sys/ioctl.h> @@ -40,15 +40,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);  } @@ -56,10 +47,6 @@ zmq::devpoll_t::devpoll_t () :  zmq::devpoll_t::~devpoll_t ()  {      worker.stop (); - -    //  Make sure there are no fds registered on shutdown. -    zmq_assert (load.get () == 0); -      close (devpoll_fd);  } @@ -73,6 +60,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; @@ -84,7 +81,7 @@ zmq::devpoll_t::handle_t zmq::devpoll_t::add_fd (fd_t fd_,      pending_list.push_back (fd_);      //  Increase the load metric of the thread. -    load.add (1); +    adjust_load (1);      return fd_;  } @@ -97,7 +94,7 @@ void zmq::devpoll_t::rm_fd (handle_t handle_)      fd_table [handle_].valid = false;      //  Decrease the load metric of the thread. -    load.sub (1); +    adjust_load (-1);  }  void zmq::devpoll_t::set_pollin (handle_t handle_) @@ -128,23 +125,6 @@ void zmq::devpoll_t::reset_pollout (handle_t handle_)      devpoll_ctl (handle_, fd_table [handle_].events);  } -void zmq::devpoll_t::add_timer (i_poll_events *events_) -{ -     timers.push_back (events_); -} - -void zmq::devpoll_t::cancel_timer (i_poll_events *events_) -{ -    timers_t::iterator it = std::find (timers.begin (), timers.end (), events_); -    if (it != timers.end ()) -        timers.erase (it); -} - -int zmq::devpoll_t::get_load () -{ -    return load.get (); -} -  void zmq::devpoll_t::start ()  {      worker.start (worker_routine, this); @@ -157,10 +137,6 @@ void zmq::devpoll_t::stop ()  void zmq::devpoll_t::loop ()  { -    //  According to the poll(7d) man page, we can retrieve -    //  no more then (OPEN_MAX - 1) events. -    int nfds = std::min ((int) max_io_events, OPEN_MAX - 1); -      while (!stopping) {          struct pollfd ev_buf [max_io_events]; @@ -170,31 +146,23 @@ void zmq::devpoll_t::loop ()              fd_table [pending_list [i]].accepted = true;          pending_list.clear (); -        poll_req.dp_fds = &ev_buf [0]; -        poll_req.dp_nfds = nfds; -        poll_req.dp_timeout = timers.empty () ? -1 : max_timer_period; +        //  Execute any due timers. +        int timeout = (int) execute_timers ();          //  Wait for events. +        //  On Solaris, we can retrieve no more then (OPEN_MAX - 1) events. +        poll_req.dp_fds = &ev_buf [0]; +#if defined ZMQ_HAVE_SOLARIS +        poll_req.dp_nfds = std::min ((int) max_io_events, OPEN_MAX - 1); +#else +        poll_req.dp_nfds = max_io_events; +#endif +        poll_req.dp_timeout = timeout ? timeout : -1;          int n = ioctl (devpoll_fd, DP_POLL, &poll_req);          if (n == -1 && errno == EINTR)              continue;          errno_assert (n != -1); -        //  Handle timer. -        if (!n) { - -            //  Use local list of timers as timer handlers may fill new timers -            //  into the original array. -            timers_t t; -            std::swap (timers, t); - -            //  Trigger all the timers. -            for (timers_t::iterator it = t.begin (); it != t.end (); it ++) -                (*it)->timer_event (); - -            continue; -        } -          for (int i = 0; i < n; i ++) {              fd_entry_t *fd_ptr = &fd_table [ev_buf [i].fd];  | 
