#include <stdexcept>
+#include <msp/core/algorithm.h>
#include "eventobject.h"
#include "poll.h"
#include "poll_platform.h"
namespace IO {
Poller::Poller():
- priv(new Private),
- objs_changed(false)
+ priv(new Private)
{ }
Poller::~Poller()
if(ev)
obj.get_event_handle();
- EventMap::iterator i = objects.find(&obj);
+ auto i = find_member(objects, &obj, &PolledObject::object);
if(i!=objects.end())
{
if(ev)
- i->second = ev;
+ i->events = ev;
else
- objects.erase(i);
-
- objs_changed = true;
+ {
+ *i = objects.back();
+ objects.pop_back();
+ objs_changed = true;
+ }
+ events_changed = true;
+ return;
}
- else if(ev)
- {
+
+ if(!ev)
+ return;
+
#ifdef _WIN32
- if(objects.size()>=MAXIMUM_WAIT_OBJECTS)
- throw logic_error("Maximum number of wait objects reached");
+ if(objects.size()>=MAXIMUM_WAIT_OBJECTS)
+ throw logic_error("Maximum number of wait objects reached");
#endif
- objects.insert(EventMap::value_type(&obj, ev));
- objs_changed = true;
- }
+ objects.push_back(PolledObject(&obj, ev));
+ objs_changed = true;
}
-int Poller::poll()
+unsigned Poller::poll()
{
return do_poll(-1);
}
-int Poller::poll(const Time::TimeDelta &timeout)
+unsigned Poller::poll(const Time::TimeDelta &timeout)
{
if(timeout<Time::zero)
throw invalid_argument("Poller::poll");
return do_poll(static_cast<int>(timeout/Time::msec));
}
-int Poller::do_poll(int timeout)
+unsigned Poller::do_poll(int timeout)
{
- if(objs_changed)
+ if(objs_changed || events_changed)
+ {
rebuild_array();
+ events_changed = false;
+ objs_changed = false;
+ }
poll_result.clear();
}
-
PollEvent platform_poll(EventObject &, PollEvent, int);
PollEvent poll(EventObject &obj, PollEvent pe)