X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/eb3d5c6416c0f0d1cad35e52af3231de7866fea8..c06ef44e7af1571710fd31dd0ab068dd77b1eb2d:/rpc/poll_mgr.cc diff --git a/rpc/poll_mgr.cc b/rpc/poll_mgr.cc index d29abd2..102b8dc 100644 --- a/rpc/poll_mgr.cc +++ b/rpc/poll_mgr.cc @@ -2,14 +2,15 @@ #include #include #include "file.h" +#include "threaded_log.h" #ifdef __linux__ #include #endif -aio_callback::~aio_callback() {} +using std::vector; -poll_mgr poll_mgr::shared_mgr; +aio_callback::~aio_callback() {} class wait_manager { public: @@ -33,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__ @@ -57,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; @@ -69,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);