mirror of
https://github.com/zeromq/libzmq.git
synced 2025-10-15 15:16:52 +02:00
Merge pull request #1616 from somdoron/ZMQ_POLLER
problem: ZMQ_POLLER doesn't support polling on out
This commit is contained in:
@@ -71,7 +71,7 @@ bool zmq::socket_poller_t::check_tag ()
|
||||
return tag == 0xCAFEBABE;
|
||||
}
|
||||
|
||||
int zmq::socket_poller_t::add_socket (void *socket_, void* user_data_)
|
||||
int zmq::socket_poller_t::add (void *socket_, void* user_data_, short events_)
|
||||
{
|
||||
for (events_t::iterator it = events.begin (); it != events.end (); ++it) {
|
||||
if (it->socket == socket_) {
|
||||
@@ -91,7 +91,7 @@ int zmq::socket_poller_t::add_socket (void *socket_, void* user_data_)
|
||||
return -1;
|
||||
}
|
||||
|
||||
event_t event = {socket_, 0, user_data_};
|
||||
event_t event = {socket_, 0, user_data_, events_};
|
||||
events.push_back (event);
|
||||
need_rebuild = true;
|
||||
|
||||
@@ -99,9 +99,9 @@ int zmq::socket_poller_t::add_socket (void *socket_, void* user_data_)
|
||||
}
|
||||
|
||||
#if defined _WIN32
|
||||
int zmq::socket_poller_t::add_fd (SOCKET fd_, void *user_data_)
|
||||
int zmq::socket_poller_t::add_fd (SOCKET fd_, void *user_data_, short events_)
|
||||
#else
|
||||
int zmq::socket_poller_t::add_fd (int fd_, void *user_data_)
|
||||
int zmq::socket_poller_t::add_fd (int fd_, void *user_data_, short events_)
|
||||
#endif
|
||||
{
|
||||
for (events_t::iterator it = events.begin (); it != events.end (); ++it) {
|
||||
@@ -111,14 +111,60 @@ int zmq::socket_poller_t::add_fd (int fd_, void *user_data_)
|
||||
}
|
||||
}
|
||||
|
||||
event_t event = {NULL, fd_, user_data_};
|
||||
event_t event = {NULL, fd_, user_data_, events_};
|
||||
events.push_back (event);
|
||||
need_rebuild = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int zmq::socket_poller_t::remove_socket (void* socket_)
|
||||
int zmq::socket_poller_t::modify (void *socket_, short events_)
|
||||
{
|
||||
events_t::iterator it;
|
||||
|
||||
for (it = events.begin (); it != events.end (); ++it) {
|
||||
if (it->socket == socket_)
|
||||
break;
|
||||
}
|
||||
|
||||
if (it == events.end()) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
it->events = events_;
|
||||
need_rebuild = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#if defined _WIN32
|
||||
int zmq::socket_poller_t::modify_fd (SOCKET fd_, short events_)
|
||||
#else
|
||||
int zmq::socket_poller_t::modify_fd (int fd_, short events_)
|
||||
#endif
|
||||
{
|
||||
events_t::iterator it;
|
||||
|
||||
for (it = events.begin (); it != events.end (); ++it) {
|
||||
if (!it->socket && it->fd == fd_)
|
||||
break;
|
||||
}
|
||||
|
||||
if (it == events.end()) {
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
it->events = events_;
|
||||
need_rebuild = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int zmq::socket_poller_t::remove (void* socket_)
|
||||
{
|
||||
events_t::iterator it;
|
||||
|
||||
@@ -185,13 +231,14 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *event_, long time
|
||||
}
|
||||
|
||||
if (rc == 0) {
|
||||
errno = EAGAIN;
|
||||
errno = ETIMEDOUT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
for (int i = 0; i < poll_size; i++) {
|
||||
if (poll_set [i].revents & ZMQ_POLLIN) {
|
||||
*event_ = poll_events[i];
|
||||
if ((poll_set [i].revents & poll_events [i].events) != 0) {
|
||||
*event_ = poll_events[i];
|
||||
event_->events = poll_set [i].revents & poll_events [i].events;
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -226,7 +273,7 @@ void zmq::socket_poller_t::rebuild ()
|
||||
if (!it->socket)
|
||||
poll_set [event_nbr].fd = it->fd;
|
||||
|
||||
poll_set [event_nbr].events = ZMQ_POLLIN;
|
||||
poll_set [event_nbr].events = it->events;
|
||||
poll_events [event_nbr] = *it;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user