X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/a4175b2e216a20b86cc872dea8a08005c60617a5..3abd3952c1f4441f0dd6eae9883b2d01ed9cd56b:/rpc/pollmgr.h diff --git a/rpc/pollmgr.h b/rpc/pollmgr.h index 89d1660..ede35f8 100644 --- a/rpc/pollmgr.h +++ b/rpc/pollmgr.h @@ -1,108 +1,46 @@ #ifndef pollmgr_h #define pollmgr_h -#include -#include -#include - -#ifdef __linux__ -#include -#endif +#include "types.h" #define MAX_POLL_FDS 128 typedef enum { - CB_NONE = 0x0, - CB_RDONLY = 0x1, - CB_WRONLY = 0x10, - CB_RDWR = 0x11, - CB_MASK = ~0x11, + CB_NONE = 0x0, + CB_RDONLY = 0x1, + CB_WRONLY = 0x10, + CB_RDWR = 0x11, + CB_MASK = ~0x11, } poll_flag; -class aio_mgr { - public: - virtual void watch_fd(int fd, poll_flag flag) = 0; - virtual bool unwatch_fd(int fd, poll_flag flag) = 0; - virtual bool is_watched(int fd, poll_flag flag) = 0; - virtual void wait_ready(std::vector *readable, std::vector *writable) = 0; - virtual ~aio_mgr() {} -}; - class aio_callback { - public: - virtual void read_cb(int fd) = 0; - virtual void write_cb(int fd) = 0; - virtual ~aio_callback() {} + public: + virtual void read_cb(int fd) = 0; + virtual void write_cb(int fd) = 0; + virtual ~aio_callback() {} }; class PollMgr { - public: - PollMgr(); - ~PollMgr(); - - static PollMgr *Instance(); - static PollMgr *CreateInst(); + public: + PollMgr(); + ~PollMgr(); - void add_callback(int fd, poll_flag flag, aio_callback *ch); - void del_callback(int fd, poll_flag flag); - bool has_callback(int fd, poll_flag flag, aio_callback *ch); - void block_remove_fd(int fd); - void wait_loop(); + static PollMgr & Instance(); + void add_callback(int fd, poll_flag flag, aio_callback *ch); + void del_callback(int fd, poll_flag flag); + void block_remove_fd(int fd); + void wait_loop(); - static PollMgr *instance; - static int useful; - static int useless; + private: + mutex m_; + cond changedone_c_; - private: - std::mutex m_; - std::condition_variable changedone_c_; - std::thread th_; - - aio_callback *callbacks_[MAX_POLL_FDS]; - aio_mgr *aio_; - bool pending_change_; + map callbacks_; + class wait_manager *aio_; + bool pending_change_=false, shutdown_=false; + thread th_; }; -class SelectAIO : public aio_mgr { - public : - - SelectAIO(); - ~SelectAIO(); - void watch_fd(int fd, poll_flag flag); - bool unwatch_fd(int fd, poll_flag flag); - bool is_watched(int fd, poll_flag flag); - void wait_ready(std::vector *readable, std::vector *writable); - - private: - - fd_set rfds_; - fd_set wfds_; - int highfds_; - int pipefd_[2]; - - std::mutex m_; - -}; - -#ifdef __linux__ -class EPollAIO : public aio_mgr { - public: - EPollAIO(); - ~EPollAIO(); - void watch_fd(int fd, poll_flag flag); - bool unwatch_fd(int fd, poll_flag flag); - bool is_watched(int fd, poll_flag flag); - void wait_ready(std::vector *readable, std::vector *writable); - - private: - int pollfd_; - struct epoll_event ready_[MAX_POLL_FDS]; - int fdstatus_[MAX_POLL_FDS]; - -}; -#endif /* __linux */ - -#endif /* pollmgr_h */ - +#endif