5 #if defined ZMQ_IOTHREAD_POLLER_USE_POLLSET
19 ctx (ctx_), stopping (
false)
21 pollset_fd = pollset_create (-1);
25 zmq::pollset_t::~pollset_t ()
30 pollset_destroy (pollset_fd);
31 for (retired_t::iterator
it = retired.begin ();
it != retired.end (); ++
it)
35 zmq::pollset_t::handle_t zmq::pollset_t::add_fd (
fd_t fd_,
36 i_poll_events *events_)
38 poll_entry_t *pe =
new (std::nothrow) poll_entry_t;
42 pe->flag_pollin =
false;
43 pe->flag_pollout =
false;
51 int rc = pollset_ctl (pollset_fd, &pc, 1);
57 if (fd_ >= fd_table.size ()) {
58 fd_table.resize (fd_ + 1,
NULL);
64 void zmq::pollset_t::rm_fd (handle_t handle_)
66 poll_entry_t *pe = (poll_entry_t *) handle_;
72 pollset_ctl (pollset_fd, &pc, 1);
74 fd_table[pe->fd] =
NULL;
77 retired.push_back (pe);
83 void zmq::pollset_t::set_pollin (handle_t handle_)
85 poll_entry_t *pe = (poll_entry_t *) handle_;
86 if (
likely (!pe->flag_pollin)) {
92 const int rc = pollset_ctl (pollset_fd, &pc, 1);
95 pe->flag_pollin =
true;
99 void zmq::pollset_t::reset_pollin (handle_t handle_)
101 poll_entry_t *pe = (poll_entry_t *) handle_;
111 int rc = pollset_ctl (pollset_fd, &pc, 1);
113 if (pe->flag_pollout) {
116 rc = pollset_ctl (pollset_fd, &pc, 1);
120 pe->flag_pollin =
false;
123 void zmq::pollset_t::set_pollout (handle_t handle_)
125 poll_entry_t *pe = (poll_entry_t *) handle_;
126 if (
likely (!pe->flag_pollout)) {
132 const int rc = pollset_ctl (pollset_fd, &pc, 1);
135 pe->flag_pollout =
true;
139 void zmq::pollset_t::reset_pollout (handle_t handle_)
141 poll_entry_t *pe = (poll_entry_t *) handle_;
151 int rc = pollset_ctl (pollset_fd, &pc, 1);
154 if (pe->flag_pollin) {
157 rc = pollset_ctl (pollset_fd, &pc, 1);
160 pe->flag_pollout =
false;
165 ctx.start_thread (
worker, worker_routine,
this);
168 void zmq::pollset_t::stop ()
173 int zmq::pollset_t::max_fds ()
178 void zmq::pollset_t::loop ()
184 int timeout = (int) execute_timers ();
194 for (
int i = 0;
i <
n;
i++) {
195 poll_entry_t *pe = fd_table[polldata_array[
i].fd];
201 if (polldata_array[
i].revents & (POLLERR | POLLHUP))
202 pe->events->in_event ();
205 if (polldata_array[
i].revents & POLLOUT)
206 pe->events->out_event ();
209 if (polldata_array[
i].revents & POLLIN)
210 pe->events->in_event ();
214 for (retired_t::iterator
it = retired.begin ();
it != retired.end ();
221 void zmq::pollset_t::worker_routine (
void *arg_)
223 ((pollset_t *) arg_)->loop ();