/* */ #ifndef D_LIBUV_EVENT_POLL_H #define D_LIBUV_EVENT_POLL_H #include "EventPoll.h" #include #include #include #include "Event.h" #include "a2functional.h" #ifdef ENABLE_ASYNC_DNS #include "AsyncNameResolver.h" #endif // ENABLE_ASYNC_DNS namespace aria2 { class LibuvEventPoll : 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); int getEvents(); }; friend int accumulateEvent(int events, const KEvent& event); private: uv_loop_t* loop; typedef std::set, DerefLess > > KSocketEntrySet; KSocketEntrySet socketEntries_; typedef std::map KPolls; KPolls polls_; #ifdef ENABLE_ASYNC_DNS typedef std::set, DerefLess > > KAsyncNameResolverEntrySet; KAsyncNameResolverEntrySet nameResolverEntries_; #endif // ENABLE_ASYNC_DNS bool addEvents(sock_t socket, const KEvent& event); bool deleteEvents(sock_t socket, const KEvent& event); #ifdef ENABLE_ASYNC_DNS bool addEvents(sock_t socket, Command* command, int events, const SharedHandle& rs); bool deleteEvents(sock_t socket, Command* command, const SharedHandle& rs); #endif static int translateEvents(EventPoll::EventType events); static void poll_callback(uv_poll_t* handle, int status, int events); public: LibuvEventPoll(); virtual ~LibuvEventPoll(); bool good() const { return loop; } virtual void poll(const struct timeval& tv); virtual bool addEvents(sock_t socket, Command* command, EventPoll::EventType events); virtual bool deleteEvents(sock_t socket, Command* command, EventPoll::EventType events); #ifdef ENABLE_ASYNC_DNS virtual bool addNameResolver(const SharedHandle& resolver, Command* command); virtual bool deleteNameResolver (const SharedHandle& resolver, Command* command); #endif // ENABLE_ASYNC_DNS static const int IEV_READ = UV_READABLE; static const int IEV_WRITE = UV_WRITABLE; static const int IEV_ERROR = 128; static const int IEV_HUP = 255; }; } // namespace aria2 #endif // D_LIBUV_EVENT_POLL_H