32 #if defined ZMQ_USE_EPOLL 34 #include <sys/epoll.h> 47 zmq::epoll_t::epoll_t (
const zmq::ctx_t &ctx_) :
51 epoll_fd = epoll_create (1);
55 zmq::epoll_t::~epoll_t ()
61 for (retired_t::iterator it = retired.begin (); it != retired.end (); ++it) {
66 zmq::epoll_t::handle_t zmq::epoll_t::add_fd (
fd_t fd_, i_poll_events *events_)
68 poll_entry_t *pe =
new (std::nothrow) poll_entry_t;
73 memset (pe, 0,
sizeof (poll_entry_t));
80 int rc = epoll_ctl (epoll_fd, EPOLL_CTL_ADD, fd_, &pe->ev);
89 void zmq::epoll_t::rm_fd (handle_t handle_)
91 poll_entry_t *pe = (poll_entry_t*) handle_;
92 int rc = epoll_ctl (epoll_fd, EPOLL_CTL_DEL, pe->fd, &pe->ev);
95 retired.push_back (pe);
101 void zmq::epoll_t::set_pollin (handle_t handle_)
103 poll_entry_t *pe = (poll_entry_t*) handle_;
104 pe->ev.events |= EPOLLIN;
105 int rc = epoll_ctl (epoll_fd, EPOLL_CTL_MOD, pe->fd, &pe->ev);
109 void zmq::epoll_t::reset_pollin (handle_t handle_)
111 poll_entry_t *pe = (poll_entry_t*) handle_;
112 pe->ev.events &= ~((short) EPOLLIN);
113 int rc = epoll_ctl (epoll_fd, EPOLL_CTL_MOD, pe->fd, &pe->ev);
117 void zmq::epoll_t::set_pollout (handle_t handle_)
119 poll_entry_t *pe = (poll_entry_t*) handle_;
120 pe->ev.events |= EPOLLOUT;
121 int rc = epoll_ctl (epoll_fd, EPOLL_CTL_MOD, pe->fd, &pe->ev);
125 void zmq::epoll_t::reset_pollout (handle_t handle_)
127 poll_entry_t *pe = (poll_entry_t*) handle_;
128 pe->ev.events &= ~((short) EPOLLOUT);
129 int rc = epoll_ctl (epoll_fd, EPOLL_CTL_MOD, pe->fd, &pe->ev);
133 void zmq::epoll_t::start ()
135 ctx.start_thread (
worker, worker_routine,
this);
143 int zmq::epoll_t::max_fds ()
148 void zmq::epoll_t::loop ()
155 int timeout = (
int) execute_timers ();
159 timeout ? timeout : -1);
165 for (
int i = 0; i < n; i ++) {
166 poll_entry_t *pe = ((poll_entry_t*) ev_buf [i].data.ptr);
170 if (ev_buf [i].events & (EPOLLERR | EPOLLHUP))
171 pe->events->in_event ();
174 if (ev_buf [i].events & EPOLLOUT)
175 pe->events->out_event ();
178 if (ev_buf [i].events & EPOLLIN)
179 pe->events->in_event ();
183 for (retired_t::iterator it = retired.begin (); it != retired.end (); ++it) {
190 void zmq::epoll_t::worker_routine (
void *arg_)
192 ((epoll_t*) arg_)->loop ();
#define LIBZMQ_DELETE(p_object)
static void worker(void *s)