All random numbers generated via one PRNG seeded in one place.
[invirt/third/libt4.git] / rpc / poll_mgr.cc
index dc42274..102b8dc 100644 (file)
@@ -2,21 +2,26 @@
 #include <errno.h>
 #include <sys/select.h>
 #include "file.h"
+#include "threaded_log.h"
 
 #ifdef __linux__
 #include <sys/epoll.h>
 #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<int> & readable, vector<int> & 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<int> & readable, vector<int> & 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);
     }