X-Git-Url: http://git.tdb.fi/?p=libs%2Fcore.git;a=blobdiff_plain;f=source%2Fio%2Funix%2Fpoll.cpp;h=0fb9d22e03919476e95d52e09ca5faf10088241f;hp=650f2268e0fd2e419c7624ce76ab8890b6e952a0;hb=292aed8e23ea543b089d5f2a73000de4640befe7;hpb=609c9a508cfdc7b42c46c4f21d17639204165a00 diff --git a/source/io/unix/poll.cpp b/source/io/unix/poll.cpp index 650f226..0fb9d22 100644 --- a/source/io/unix/poll.cpp +++ b/source/io/unix/poll.cpp @@ -43,6 +43,8 @@ inline PollEvent poll_event_from_sys(int event) result = result|P_OUTPUT; if(event&POLLERR) result = result|P_ERROR; + if(event&POLLHUP) + result = result|P_HANGUP; return result; } @@ -55,17 +57,24 @@ namespace IO { void Poller::rebuild_array() { - priv->pfd.clear(); + if(objs_changed) + { + priv->pfd.clear(); + priv->pfd.reserve(objects.size()); - for(EventMap::iterator i=objects.begin(); i!=objects.end(); ++i) + for(vector::const_iterator i=objects.begin(); i!=objects.end(); ++i) + { + pollfd p; + p.fd = *i->object->get_event_handle(); + p.events = sys_poll_event(i->events); + priv->pfd.push_back(p); + } + } + else { - pollfd p; - p.fd = *i->first->get_event_handle(); - p.events = sys_poll_event(i->second); - priv->pfd.push_back(p); + for(unsigned i=0; ipfd[i].events = sys_poll_event(objects[i].events); } - - objs_changed = false; } void Poller::platform_poll(int timeout) @@ -79,11 +88,10 @@ void Poller::platform_poll(int timeout) throw system_error("poll"); } - EventMap::iterator j = objects.begin(); - for(vector::iterator i=priv->pfd.begin(); (i!=priv->pfd.end() && ret>0); ++i, ++j) - if(i->revents) + for(unsigned i=0; (i0); ++i) + if(priv->pfd[i].revents) { - poll_result.push_back(Slot(j->first, poll_event_from_sys(i->revents))); + poll_result.push_back(Slot(objects[i].object, poll_event_from_sys(priv->pfd[i].revents))); --ret; } }