#ifndef MSP_IO_POLL_H_
#define MSP_IO_POLL_H_
-#ifndef WIN32
-#include <poll.h>
-#endif
#include <list>
#include <map>
#include <vector>
#include <msp/time/timedelta.h>
-#include "types.h"
namespace Msp {
namespace IO {
-class Base;
+class EventObject;
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)
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<Slot> SlotSeq;
+ typedef std::list<Slot> SlotList;
private:
- typedef std::map<Base *, Slot> SlotMap;
+ typedef std::map<EventObject *, PollEvent> EventMap;
-#ifdef WIN32
- struct pollfd
- {
- Handle fd;
- };
-#endif
+ struct Private;
- SlotMap objects;
- std::vector<pollfd> pfd;
- bool pfd_dirty;
- SlotSeq poll_result;
+ EventMap objects;
+ Private *priv;
+ bool objs_changed;
+ SlotList poll_result;
public:
Poller();
+ ~Poller();
- void set_object(Base &, PollEvent);
+ void set_object(EventObject &, PollEvent);
int poll();
int poll(const Time::TimeDelta &);
private:
- void rebuild_pfd();
+ void rebuild_array();
int do_poll(int);
+ void platform_poll(int);
public:
- const SlotSeq &get_result() const { return poll_result; }
+ const SlotList &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