From 212ab4f834e2684feec39b6fe5ea263145c15a17 Mon Sep 17 00:00:00 2001 From: Jacques Germishuys Date: Mon, 18 Mar 2019 10:12:38 +0000 Subject: [PATCH] Problem: /dev/poll doesn't compile Solution: Make devpoll_t derive from worker_poller_base_t --- src/devpoll.cpp | 35 ++++++++++++++++++++--------------- src/devpoll.hpp | 15 +-------------- 2 files changed, 21 insertions(+), 29 deletions(-) diff --git a/src/devpoll.cpp b/src/devpoll.cpp index d11ab16d..11b38ccb 100644 --- a/src/devpoll.cpp +++ b/src/devpoll.cpp @@ -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 diff --git a/src/devpoll.hpp b/src/devpoll.hpp index ef84d808..871cc8ec 100644 --- a/src/devpoll.hpp +++ b/src/devpoll.hpp @@ -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 &); };