X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/4e881433f37417ccbda89c09ffdf936855d462d4..c06ef44e7af1571710fd31dd0ab068dd77b1eb2d:/rpc/poll_mgr.cc diff --git a/rpc/poll_mgr.cc b/rpc/poll_mgr.cc index dc42274..102b8dc 100644 --- a/rpc/poll_mgr.cc +++ b/rpc/poll_mgr.cc @@ -2,21 +2,26 @@ #include #include #include "file.h" +#include "threaded_log.h" #ifdef __linux__ #include #endif -poll_mgr poll_mgr::shared_mgr; +using std::vector; + +aio_callback::~aio_callback() {} class wait_manager { public: virtual void watch_fd(int fd, poll_flag flag) = 0; virtual bool unwatch_fd(int fd, poll_flag flag) = 0; virtual void wait_ready(vector & readable, vector & writable) = 0; - virtual ~wait_manager() noexcept {} + virtual ~wait_manager() noexcept; }; +wait_manager::~wait_manager() noexcept {} + class SelectAIO : public wait_manager { public : SelectAIO(); @@ -29,7 +34,7 @@ class SelectAIO : public wait_manager { fd_set rfds_, wfds_; int highfds_; file_t pipe_[2]; - mutex m_; + std::mutex m_; }; #ifdef __linux__ @@ -53,9 +58,14 @@ poll_mgr::poll_mgr() : aio_(new SelectAIO()) { th_ = thread(&poll_mgr::wait_loop, this); } -poll_mgr::~poll_mgr() -{ +poll_mgr::~poll_mgr() { + shutdown(); +} + +void poll_mgr::shutdown() { lock ml(m_); + if (shutdown_) + return; for (auto p : callbacks_) aio_->unwatch_fd(p.first, CB_RDWR); pending_change_ = true; @@ -65,9 +75,7 @@ poll_mgr::~poll_mgr() th_.join(); } -void -poll_mgr::add_callback(int fd, poll_flag flag, aio_callback *ch) -{ +void poll_mgr::add_callback(int fd, poll_flag flag, aio_callback *ch) { lock ml(m_); aio_->watch_fd(fd, flag); @@ -192,7 +200,7 @@ void SelectAIO::wait_ready(vector & readable, vector & writable) { return; else if (ret < 0) { perror("select:"); - IF_LEVEL(0) LOG("select_loop failure errno " << errno); + IF_LEVEL(0) LOG << "select_loop failure errno " << errno; VERIFY(0); }