0
0
mirror of https://github.com/zeromq/libzmq.git synced 2024-12-27 15:41:05 +08:00

Problem: /dev/poll doesn't compile

Solution: Make devpoll_t derive from worker_poller_base_t
This commit is contained in:
Jacques Germishuys 2019-03-18 10:12:38 +00:00
parent bd6fa4bbb3
commit 212ab4f834
2 changed files with 21 additions and 29 deletions

View File

@ -47,8 +47,7 @@
#include "i_poll_events.hpp"
zmq::devpoll_t::devpoll_t (const zmq::thread_ctx_t &ctx_) :
ctx (ctx_),
stopping (false)
worker_poller_base_t (ctx_)
{
devpoll_fd = open ("/dev/poll", O_RDWR);
errno_assert (devpoll_fd != -1);
@ -56,7 +55,9 @@ zmq::devpoll_t::devpoll_t (const zmq::thread_ctx_t &ctx_) :
zmq::devpoll_t::~devpoll_t ()
{
worker.stop ();
// Wait till the worker thread exits.
stop_worker ();
close (devpoll_fd);
}
@ -70,6 +71,7 @@ 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_)
{
check_thread ();
// 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_) {
@ -98,6 +100,7 @@ zmq::devpoll_t::handle_t zmq::devpoll_t::add_fd (fd_t fd_,
void zmq::devpoll_t::rm_fd (handle_t handle_)
{
check_thread ();
zmq_assert (fd_table[handle_].valid);
devpoll_ctl (handle_, POLLREMOVE);
@ -109,6 +112,7 @@ void zmq::devpoll_t::rm_fd (handle_t handle_)
void zmq::devpoll_t::set_pollin (handle_t handle_)
{
check_thread ();
devpoll_ctl (handle_, POLLREMOVE);
fd_table[handle_].events |= POLLIN;
devpoll_ctl (handle_, fd_table[handle_].events);
@ -116,6 +120,7 @@ void zmq::devpoll_t::set_pollin (handle_t handle_)
void zmq::devpoll_t::reset_pollin (handle_t handle_)
{
check_thread ();
devpoll_ctl (handle_, POLLREMOVE);
fd_table[handle_].events &= ~((short) POLLIN);
devpoll_ctl (handle_, fd_table[handle_].events);
@ -123,6 +128,7 @@ void zmq::devpoll_t::reset_pollin (handle_t handle_)
void zmq::devpoll_t::set_pollout (handle_t handle_)
{
check_thread ();
devpoll_ctl (handle_, POLLREMOVE);
fd_table[handle_].events |= POLLOUT;
devpoll_ctl (handle_, fd_table[handle_].events);
@ -130,19 +136,15 @@ void zmq::devpoll_t::set_pollout (handle_t handle_)
void zmq::devpoll_t::reset_pollout (handle_t handle_)
{
check_thread ();
devpoll_ctl (handle_, POLLREMOVE);
fd_table[handle_].events &= ~((short) POLLOUT);
devpoll_ctl (handle_, fd_table[handle_].events);
}
void zmq::devpoll_t::start ()
{
ctx.start_thread (worker, worker_routine, this);
}
void zmq::devpoll_t::stop ()
{
stopping = true;
check_thread ();
}
int zmq::devpoll_t::max_fds ()
@ -152,7 +154,7 @@ int zmq::devpoll_t::max_fds ()
void zmq::devpoll_t::loop ()
{
while (!stopping) {
while (true) {
struct pollfd ev_buf[max_io_events];
struct dvpoll poll_req;
@ -163,6 +165,14 @@ void zmq::devpoll_t::loop ()
// Execute any due timers.
int timeout = (int) execute_timers ();
if (get_load () == 0) {
if (timeout == 0)
break;
// TODO sleep for timeout
continue;
}
// Wait for events.
// On Solaris, we can retrieve no more then (OPEN_MAX - 1) events.
poll_req.dp_fds = &ev_buf[0];
@ -195,9 +205,4 @@ void zmq::devpoll_t::loop ()
}
}
void zmq::devpoll_t::worker_routine (void *arg_)
{
((devpoll_t *) arg_)->loop ();
}
#endif

View File

@ -47,7 +47,7 @@ struct i_poll_events;
// Implements socket polling mechanism using the "/dev/poll" interface.
class devpoll_t : public poller_base_t
class devpoll_t : public worker_poller_base_t
{
public:
typedef fd_t handle_t;
@ -62,21 +62,14 @@ class devpoll_t : public poller_base_t
void reset_pollin (handle_t handle_);
void set_pollout (handle_t handle_);
void reset_pollout (handle_t handle_);
void start ();
void stop ();
static int max_fds ();
private:
// Main worker thread routine.
static void worker_routine (void *arg_);
// Main event loop.
void loop ();
// Reference to ZMQ context.
const thread_ctx_t &ctx;
// File descriptor referring to "/dev/poll" pseudo-device.
fd_t devpoll_fd;
@ -97,12 +90,6 @@ class devpoll_t : public poller_base_t
// Pollset manipulation function.
void devpoll_ctl (fd_t fd_, short events_);
// If true, thread is in the process of shutting down.
bool stopping;
// Handle of the physical thread doing the I/O work.
thread_t worker;
devpoll_t (const devpoll_t &);
const devpoll_t &operator= (const devpoll_t &);
};