32 #if defined ZMQ_USE_POLL 34 #include <sys/types.h> 51 zmq::poll_t::~poll_t ()
56 zmq::poll_t::handle_t zmq::poll_t::add_fd (
fd_t fd_, i_poll_events *events_)
59 fd_table_t::size_type sz = fd_table.size ();
60 if (sz <= (fd_table_t::size_type) fd_) {
61 fd_table.resize (fd_ + 1);
62 while (sz != (fd_table_t::size_type) (fd_ + 1)) {
68 pollfd pfd = {fd_, 0, 0};
69 pollset.push_back (pfd);
72 fd_table [fd_].index = pollset.size() - 1;
73 fd_table [fd_].events = events_;
81 void zmq::poll_t::rm_fd (handle_t handle_)
83 fd_t index = fd_table [handle_].index;
95 void zmq::poll_t::set_pollin (handle_t handle_)
97 int index = fd_table [handle_].index;
98 pollset [index].events |= POLLIN;
101 void zmq::poll_t::reset_pollin (handle_t handle_)
103 int index = fd_table [handle_].index;
104 pollset [index].events &= ~((short) POLLIN);
107 void zmq::poll_t::set_pollout (handle_t handle_)
109 int index = fd_table [handle_].index;
110 pollset [index].events |= POLLOUT;
113 void zmq::poll_t::reset_pollout (handle_t handle_)
115 int index = fd_table [handle_].index;
116 pollset [index].events &= ~((short) POLLOUT);
119 void zmq::poll_t::start ()
121 ctx.start_thread (
worker, worker_routine,
this);
129 int zmq::poll_t::max_fds ()
134 void zmq::poll_t::loop ()
139 int timeout = (
int) execute_timers ();
142 int rc = poll (&pollset [0], pollset.size (), timeout ? timeout : -1);
153 for (pollset_t::size_type i = 0; i != pollset.size (); i++) {
155 zmq_assert (!(pollset [i].revents & POLLNVAL));
158 if (pollset [i].revents & (POLLERR | POLLHUP))
159 fd_table [pollset [i].fd].events->in_event ();
162 if (pollset [i].revents & POLLOUT)
163 fd_table [pollset [i].fd].events->out_event ();
166 if (pollset [i].revents & POLLIN)
167 fd_table [pollset [i].fd].events->in_event ();
172 pollset_t::size_type i = 0;
173 while (i < pollset.size ()) {
175 pollset.erase (pollset.begin () + i);
177 fd_table [pollset [i].fd].index = i;
186 void zmq::poll_t::worker_routine (
void *arg_)
188 ((poll_t*) arg_)->loop ();
static void worker(void *s)