1 #include "scd_sock_poller.h"
8 #include "scd_exception.h"
9 #include "scd_logging.h"
12 bool scd_sock_poller::register_handler(scd_sock_ev_handler_if& handler,
15 // can not register the same handler twice
16 if (_handler_exists(handler))
18 scd_warn("socket handler already registered while registering");
23 _handlers.push_back(&handler);
25 // register socket and events
27 fd.fd = handler.get_sock()._socket;
29 _events.push_back(fd);
32 } // register_handler()
35 bool scd_sock_poller::remove_handler(const scd_sock_ev_handler_if &handler)
37 int idx = _get_index(handler);
39 // check if handler was found
42 scd_warn("socket handler not registered while removing poll handler");
46 // remove events and handler from vectors
47 _events.erase(_events.begin() + idx);
48 _handlers.erase(_handlers.begin() + idx);
55 bool scd_sock_poller::set_ev(const scd_sock_ev_handler_if &handler,
58 int idx = _get_index(handler);
62 scd_warn("socket handler not registered while setting poll events");
66 _events[idx].events = events;
72 bool scd_sock_poller::get_ev(const scd_sock_ev_handler_if &handler,
73 sock_ev &events) const
75 int idx = _get_index(handler);
79 scd_warn("socket handler not registered while getting poll events");
83 events = _events[idx].events;
90 bool scd_sock_poller::wait(int ms)
100 bool scd_sock_poller::process()
104 if (ret != 0) // events occured
115 void scd_sock_poller::wait_process()
123 bool scd_sock_poller::_handler_exists(const scd_sock_ev_handler_if &handler)
126 std::vector<scd_sock_ev_handler_if*>::const_iterator iter;
128 iter = std::find(_handlers.begin(), _handlers.end(), &handler);
130 if (iter == _handlers.end())
135 } // _handler_exists()
138 int scd_sock_poller::_get_index(const scd_sock_ev_handler_if &handler) const
140 std::vector<scd_sock_ev_handler_if*>::const_iterator iter;
142 iter = std::find(_handlers.begin(), _handlers.end(), &handler);
144 if (iter == _handlers.end())
151 // return index (random access iterator)
152 return iter - _handlers.begin();
158 int scd_sock_poller::_poll(int ms)
162 if (ms < 0 && _events.size() == 0)
164 scd_debug("immediately returning form infinite poll: no events to watch");
170 ret = poll(&_events[0], _events.size(), ms);
171 if (ret == -1 && errno != EINTR)
173 std::string error("poll(): ");
174 error += std::string(strerror(errno));
175 throw scd_exception(error);
178 while (ret == -1 && errno == EINTR);
185 void scd_sock_poller::_callback()
187 /* called handlers might remove themselves. as the order
188 * should not break we operate on copies here */
189 std::vector<pollfd> events_cpy = _events;
190 std::vector<scd_sock_ev_handler_if*> handlers_cpy = _handlers;
193 for (int i=0; i<events_cpy.size(); i++)
195 if (events_cpy[i].events & events_cpy[i].revents)
197 // this event occured => callback handler
198 handlers_cpy[i]->handle_sock_ev(events_cpy[i].revents);