0
0
mirror of https://github.com/zeromq/libzmq.git synced 2025-01-14 17:58:01 +08:00

Problem: Poller event fd unspecified

Solution: Specify an invalid file descriptor for socket events
This commit is contained in:
Gudmundur Adalsteinsson 2020-04-27 21:00:45 +00:00
parent b56195e995
commit bf22a9f3e9
4 changed files with 16 additions and 10 deletions

View File

@ -104,11 +104,7 @@ The *zmq_poller_event_t* structure is defined as follows:
typedef struct typedef struct
{ {
void *socket; void *socket;
#if defined _WIN32 zmq_fd_t fd;
SOCKET fd;
#else
int fd;
#endif
void *user_data; void *user_data;
short events; short events;
} zmq_poller_event_t; } zmq_poller_event_t;
@ -142,6 +138,9 @@ _zmq_poller_size_.
_zmq_poller_wait_all_ returns the number of valid elements. The valid elements _zmq_poller_wait_all_ returns the number of valid elements. The valid elements
are placed in positions '0' to 'n_events - 1' in the 'events' array. All are placed in positions '0' to 'n_events - 1' in the 'events' array. All
members of a valid element are set to valid values by _zmq_poller_wait_all_. members of a valid element are set to valid values by _zmq_poller_wait_all_.
For socket events 'socket' is non-null and 'fd' is an operating system
specific value for an invalid socket (-1 or INVALID_SOCKET). For fd events
'socket' is NULL and 'fd' is a valid file descriptor.
The client does therefore not need to initialize the contents of the events The client does therefore not need to initialize the contents of the events
array before a call to _zmq_poller_wait_all_. It is unspecified whether the array before a call to _zmq_poller_wait_all_. It is unspecified whether the
the remaining elements of 'events' are written to by _zmq_poller_wait_all_. the remaining elements of 'events' are written to by _zmq_poller_wait_all_.

View File

@ -403,7 +403,7 @@ void zmq::socket_poller_t::zero_trail_events (
{ {
for (int i = found_; i < n_events_; ++i) { for (int i = found_; i < n_events_; ++i) {
events_[i].socket = NULL; events_[i].socket = NULL;
events_[i].fd = 0; events_[i].fd = zmq::retired_fd;
events_[i].user_data = NULL; events_[i].user_data = NULL;
events_[i].events = 0; events_[i].events = 0;
} }
@ -435,7 +435,7 @@ int zmq::socket_poller_t::check_events (zmq::socket_poller_t::event_t *events_,
if (it->events & events) { if (it->events & events) {
events_[found].socket = it->socket; events_[found].socket = it->socket;
events_[found].fd = 0; events_[found].fd = zmq::retired_fd;
events_[found].user_data = it->user_data; events_[found].user_data = it->user_data;
events_[found].events = it->events & events; events_[found].events = it->events & events;
++found; ++found;

View File

@ -1299,9 +1299,10 @@ int zmq_poller_wait (void *poller_, zmq_poller_event_t *event_, long timeout_)
const int rc = zmq_poller_wait_all (poller_, event_, 1, timeout_); const int rc = zmq_poller_wait_all (poller_, event_, 1, timeout_);
if (rc < 0 && event_) { if (rc < 0 && event_) {
// TODO this is not portable... zmq_poller_event_t contains pointers, event_->socket = NULL;
// for which nullptr does not need to be represented by all-zeroes event_->fd = zmq::retired_fd;
memset (event_, 0, sizeof (zmq_poller_event_t)); event_->user_data = NULL;
event_->events = 0;
} }
// wait_all returns number of events, but we return 0 for any success // wait_all returns number of events, but we return 0 for any success
return rc >= 0 ? 0 : rc; return rc >= 0 ? 0 : rc;

View File

@ -686,6 +686,9 @@ void test_poll_client_server ()
TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_wait (poller, &event, 500)); TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_wait (poller, &event, 500));
TEST_ASSERT_EQUAL_PTR (server, event.socket); TEST_ASSERT_EQUAL_PTR (server, event.socket);
TEST_ASSERT_NULL (event.user_data); TEST_ASSERT_NULL (event.user_data);
#ifndef _WIN32
TEST_ASSERT (event.fd == -1);
#endif
recv_string_expect_success (server, client_server_msg, 0); recv_string_expect_success (server, client_server_msg, 0);
// Polling on pollout // Polling on pollout
@ -694,6 +697,9 @@ void test_poll_client_server ()
TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_wait (poller, &event, 0)); TEST_ASSERT_SUCCESS_ERRNO (zmq_poller_wait (poller, &event, 0));
TEST_ASSERT_EQUAL_PTR (server, event.socket); TEST_ASSERT_EQUAL_PTR (server, event.socket);
TEST_ASSERT_NULL (event.user_data); TEST_ASSERT_NULL (event.user_data);
#ifndef _WIN32
TEST_ASSERT (event.fd == -1);
#endif
TEST_ASSERT_EQUAL_INT (ZMQ_POLLOUT, event.events); TEST_ASSERT_EQUAL_INT (ZMQ_POLLOUT, event.events);
// Stop polling server // Stop polling server