X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fpoll.h;h=fdb68c515bbe35e0e05cafdde93e59c625a7bced;hp=6367d8f2b301544f26953220284868d7658b22fb;hb=292aed8e23ea543b089d5f2a73000de4640befe7;hpb=c7afef88380ebebc8c2b04e48664d73281ec8848 diff --git a/source/io/poll.h b/source/io/poll.h index 6367d8f..fdb68c5 100644 --- a/source/io/poll.h +++ b/source/io/poll.h @@ -1,19 +1,16 @@ #ifndef MSP_IO_POLL_H_ #define MSP_IO_POLL_H_ -#ifndef WIN32 -#include -#endif -#include #include #include +#include +#include #include -#include "types.h" namespace Msp { namespace IO { -class Base; +class EventObject; enum PollEvent { @@ -21,7 +18,8 @@ enum PollEvent P_INPUT = 1, P_PRIO = 2, P_OUTPUT = 4, - P_ERROR = 8 + P_ERROR = 8, + P_HANGUP = 16 }; inline PollEvent operator|(PollEvent e, PollEvent f) @@ -34,47 +32,44 @@ inline PollEvent operator~(PollEvent e) { return PollEvent(~static_cast(e)); } -class Poller +class Poller: private NonCopyable { public: struct Slot { - Base *object; + EventObject *object; PollEvent events; - Slot(Base *o, PollEvent e): object(o), events(e) { } + Slot(EventObject *o, PollEvent e): object(o), events(e) { } }; - typedef std::list SlotSeq; + typedef std::vector SlotList DEPRECATED; private: - typedef std::map SlotMap; - -#ifdef WIN32 - struct pollfd - { - Handle fd; - }; -#endif + struct Private; - SlotMap objects; - std::vector pfd; - bool pfd_dirty; - SlotSeq poll_result; - - void rebuild_pfd(); - int do_poll(int); + std::vector objects; + Private *priv; + bool events_changed; + bool objs_changed; + std::vector poll_result; public: Poller(); + ~Poller(); - void set_object(Base &, PollEvent); + void set_object(EventObject &, PollEvent); int poll(); int poll(const Time::TimeDelta &); - const SlotSeq &get_result() const { return poll_result; } +private: + void rebuild_array(); + int do_poll(int); + void platform_poll(int); +public: + const std::vector &get_result() const { return poll_result; } }; -PollEvent poll(Base &, PollEvent); -PollEvent poll(Base &, PollEvent, const Time::TimeDelta &); +PollEvent poll(EventObject &, PollEvent); +PollEvent poll(EventObject &, PollEvent, const Time::TimeDelta &); } // namespace IO } // namespace Msp