2 #include <msp/core/systemerror.h>
4 #include "eventobject.h"
6 #include "handle_private.h"
8 #include "poll_platform.h"
15 using namespace Msp::IO;
17 inline short int sys_poll_event(PollEvent event)
21 if(event&~(P_INPUT|P_PRIO|P_OUTPUT))
22 throw invalid_argument("sys_poll_event");
34 inline PollEvent poll_event_from_sys(int event)
36 PollEvent result = P_NONE;
39 result = result|P_INPUT;
41 result = result|P_PRIO;
43 result = result|P_OUTPUT;
45 result = result|P_ERROR;
47 result = result|P_HANGUP;
58 void Poller::rebuild_array()
62 for(EventMap::iterator i=objects.begin(); i!=objects.end(); ++i)
65 p.fd = *i->first->get_event_handle();
66 p.events = sys_poll_event(i->second);
67 priv->pfd.push_back(p);
73 void Poller::platform_poll(int timeout)
75 int ret = ::poll(&priv->pfd.front(), priv->pfd.size(), timeout);
81 throw system_error("poll");
84 EventMap::iterator j = objects.begin();
85 for(vector<pollfd>::iterator i=priv->pfd.begin(); (i!=priv->pfd.end() && ret>0); ++i, ++j)
88 poll_result.push_back(Slot(j->first, poll_event_from_sys(i->revents)));
94 PollEvent platform_poll(EventObject &obj, PollEvent pe, int timeout)
96 pollfd pfd = { *obj.get_event_handle(), sys_poll_event(pe), 0 };
98 int ret = ::poll(&pfd, 1, timeout);
104 throw system_error("poll");
107 return poll_event_from_sys(pfd.revents);