/* */ #ifndef D_KQUEUE_EVENT_POLL_H #define D_KQUEUE_EVENT_POLL_H #include "EventPoll.h" #include #include #include #include #include "Event.h" #include "a2functional.h" #ifdef ENABLE_ASYNC_DNS #include "AsyncNameResolver.h" #endif // ENABLE_ASYNC_DNS namespace aria2 { class KqueueEventPoll : public EventPoll { private: class KSocketEntry; typedef Event KEvent; typedef CommandEvent KCommandEvent; typedef ADNSEvent KADNSEvent; typedef AsyncNameResolverEntry KAsyncNameResolverEntry; friend class AsyncNameResolverEntry; class KSocketEntry : public SocketEntry { public: KSocketEntry(sock_t socket); KSocketEntry(const KSocketEntry&) = delete; KSocketEntry(KSocketEntry&&) = default; // eventlist should be at least size 2. This function returns the // number of filled struct kevent in eventlist. size_t getEvents(struct kevent* eventlist); }; friend int accumulateEvent(int events, const KEvent& event); private: typedef std::map KSocketEntrySet; KSocketEntrySet socketEntries_; #ifdef ENABLE_ASYNC_DNS typedef std::map, KAsyncNameResolverEntry> KAsyncNameResolverEntrySet; KAsyncNameResolverEntrySet nameResolverEntries_; #endif // ENABLE_ASYNC_DNS int kqfd_; size_t kqEventsSize_; std::unique_ptr kqEvents_; static const size_t KQUEUE_EVENTS_MAX = 1024; bool addEvents(sock_t socket, const KEvent& event); bool deleteEvents(sock_t socket, const KEvent& event); bool addEvents(sock_t socket, Command* command, int events, const std::shared_ptr& rs); bool deleteEvents(sock_t socket, Command* command, const std::shared_ptr& rs); public: KqueueEventPoll(); bool good() const; virtual ~KqueueEventPoll(); virtual void poll(const struct timeval& tv) CXX11_OVERRIDE; virtual bool addEvents(sock_t socket, Command* command, EventPoll::EventType events) CXX11_OVERRIDE; virtual bool deleteEvents(sock_t socket, Command* command, EventPoll::EventType events) CXX11_OVERRIDE; #ifdef ENABLE_ASYNC_DNS virtual bool addNameResolver(const std::shared_ptr& resolver, Command* command) CXX11_OVERRIDE; virtual bool deleteNameResolver(const std::shared_ptr& resolver, Command* command) CXX11_OVERRIDE; #endif // ENABLE_ASYNC_DNS static const int IEV_READ = POLLIN; static const int IEV_WRITE = POLLOUT; static const int IEV_ERROR = POLLERR; static const int IEV_HUP = POLLHUP; }; } // namespace aria2 #endif // D_KQUEUE_EVENT_POLL_H