X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Fpoll.cpp;h=a5d2d023c81d3f1ae730fc69d8d903b5546926db;hp=6da777cf4470778f4e6401dbcc39f1a3a539b4e7;hb=242a4a9abe1e1113b5eb39aa751aa054f696d7be;hpb=1a563cfd722a5571428562259790b4948980dd4f diff --git a/source/io/poll.cpp b/source/io/poll.cpp index 6da777c..a5d2d02 100644 --- a/source/io/poll.cpp +++ b/source/io/poll.cpp @@ -10,6 +10,7 @@ namespace IO { Poller::Poller(): priv(new Private), + events_changed(false), objs_changed(false) { } @@ -24,34 +25,39 @@ void Poller::set_object(EventObject &obj, PollEvent ev) if(ev) obj.get_event_handle(); - EventMap::iterator i = objects.find(&obj); - if(i!=objects.end()) - { - if(ev) - i->second = ev; - else - objects.erase(i); + for(vector::iterator i=objects.begin(); i!=objects.end(); ++i) + if(i->object==&obj) + { + if(ev) + i->events = ev; + else + { + *i = objects.back(); + objects.pop_back(); + objs_changed = true; + } + events_changed = true; + return; + } + + if(!ev) + return; - objs_changed = true; - } - else if(ev) - { #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(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(); @@ -72,7 +82,6 @@ int Poller::do_poll(int timeout) } - PollEvent platform_poll(EventObject &, PollEvent, int); PollEvent poll(EventObject &obj, PollEvent pe)