Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Restore /dev/poll support #3451

Merged
merged 3 commits into from
Mar 18, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ case of a released version.

OS and version | Architecture | Compiler and version | Build system | Last report | Remarks
-------------- | ------------ | -------------------- | ------------ | ----------- | -------
Solaris 10 | x86, amd64, sparc | GCC 8.1.0 | CMake | 2019/03/18 |


### Supported platforms without known active users
Expand Down
35 changes: 20 additions & 15 deletions src/devpoll.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,17 @@
#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);
}

zmq::devpoll_t::~devpoll_t ()
{
worker.stop ();
// Wait till the worker thread exits.
stop_worker ();

close (devpoll_fd);
}

Expand All @@ -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_) {
Expand Down Expand Up @@ -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);
Expand All @@ -109,40 +112,39 @@ 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);
}

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);
}

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);
}

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 ()
Expand All @@ -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;

Expand All @@ -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];
Expand Down Expand Up @@ -195,9 +205,4 @@ void zmq::devpoll_t::loop ()
}
}

void zmq::devpoll_t::worker_routine (void *arg_)
{
((devpoll_t *) arg_)->loop ();
}

#endif
15 changes: 1 addition & 14 deletions src/devpoll.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;

Expand All @@ -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 &);
};
Expand Down
3 changes: 0 additions & 3 deletions src/epoll.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,9 +103,6 @@ class epoll_t : public worker_poller_base_t
typedef std::vector<poll_entry_t *> retired_t;
retired_t _retired;

// Handle of the physical thread doing the I/O work.
thread_t _worker;

epoll_t (const epoll_t &);
const epoll_t &operator= (const epoll_t &);
};
Expand Down