0
0
mirror of https://github.com/zeromq/libzmq.git synced 2024-12-27 07:31:03 +08:00

Merge pull request #3866 from gummif/gfa/poller-refactoring

Problem: poller item lookup can be simplified
This commit is contained in:
Luca Boccassi 2020-04-20 09:34:57 +01:00 committed by GitHub
commit f00f464566
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 55 deletions

View File

@ -41,6 +41,18 @@ static bool is_thread_safe (const zmq::socket_base_t &socket_)
return socket_.is_thread_safe ();
}
// compare elements to value
template <class It, class T, class Pred>
static It find_if2 (It b_, It e_, const T &value, Pred pred)
{
for (; b_ != e_; ++b_) {
if (pred (*b_, value)) {
break;
}
}
return b_;
}
zmq::socket_poller_t::socket_poller_t () :
_tag (0xCAFEBABE),
_signaler (NULL)
@ -101,12 +113,10 @@ int zmq::socket_poller_t::add (socket_base_t *socket_,
void *user_data_,
short events_)
{
for (items_t::iterator it = _items.begin (), end = _items.end (); it != end;
++it) {
if (it->socket == socket_) {
errno = EINVAL;
return -1;
}
if (find_if2 (_items.begin (), _items.end (), socket_, &is_socket)
!= _items.end ()) {
errno = EINVAL;
return -1;
}
if (is_thread_safe (*socket_)) {
@ -151,12 +161,10 @@ int zmq::socket_poller_t::add (socket_base_t *socket_,
int zmq::socket_poller_t::add_fd (fd_t fd_, void *user_data_, short events_)
{
for (items_t::iterator it = _items.begin (), end = _items.end (); it != end;
++it) {
if (!it->socket && it->fd == fd_) {
errno = EINVAL;
return -1;
}
if (find_if2 (_items.begin (), _items.end (), fd_, &is_fd)
!= _items.end ()) {
errno = EINVAL;
return -1;
}
const item_t item = {
@ -183,15 +191,10 @@ int zmq::socket_poller_t::add_fd (fd_t fd_, void *user_data_, short events_)
int zmq::socket_poller_t::modify (const socket_base_t *socket_, short events_)
{
const items_t::iterator end = _items.end ();
items_t::iterator it;
const items_t::iterator it =
find_if2 (_items.begin (), _items.end (), socket_, &is_socket);
for (it = _items.begin (); it != end; ++it) {
if (it->socket == socket_)
break;
}
if (it == end) {
if (it == _items.end ()) {
errno = EINVAL;
return -1;
}
@ -205,15 +208,10 @@ int zmq::socket_poller_t::modify (const socket_base_t *socket_, short events_)
int zmq::socket_poller_t::modify_fd (fd_t fd_, short events_)
{
const items_t::iterator end = _items.end ();
items_t::iterator it;
const items_t::iterator it =
find_if2 (_items.begin (), _items.end (), fd_, &is_fd);
for (it = _items.begin (); it != end; ++it) {
if (!it->socket && it->fd == fd_)
break;
}
if (it == end) {
if (it == _items.end ()) {
errno = EINVAL;
return -1;
}
@ -227,15 +225,10 @@ int zmq::socket_poller_t::modify_fd (fd_t fd_, short events_)
int zmq::socket_poller_t::remove (socket_base_t *socket_)
{
const items_t::iterator end = _items.end ();
items_t::iterator it;
const items_t::iterator it =
find_if2 (_items.begin (), _items.end (), socket_, &is_socket);
for (it = _items.begin (); it != end; ++it) {
if (it->socket == socket_)
break;
}
if (it == end) {
if (it == _items.end ()) {
errno = EINVAL;
return -1;
}
@ -252,15 +245,10 @@ int zmq::socket_poller_t::remove (socket_base_t *socket_)
int zmq::socket_poller_t::remove_fd (fd_t fd_)
{
const items_t::iterator end = _items.end ();
items_t::iterator it;
const items_t::iterator it =
find_if2 (_items.begin (), _items.end (), fd_, &is_fd);
for (it = _items.begin (); it != end; ++it) {
if (!it->socket && it->fd == fd_)
break;
}
if (it == end) {
if (it == _items.end ()) {
errno = EINVAL;
return -1;
}

View File

@ -86,6 +86,17 @@ class socket_poller_t
bool check_tag () const;
private:
typedef struct item_t
{
socket_base_t *socket;
fd_t fd;
void *user_data;
short events;
#if defined ZMQ_POLL_BASED_ON_POLL
int pollfd_index;
#endif
} item_t;
static void zero_trail_events (zmq::socket_poller_t::event_t *events_,
int n_events_,
int found_);
@ -103,6 +114,15 @@ class socket_poller_t
uint64_t &now_,
uint64_t &end_,
bool &first_pass_);
static bool is_socket (const item_t &item, const socket_base_t *socket_)
{
return item.socket == socket_;
}
static bool is_fd (const item_t &item, fd_t fd_)
{
return !item.socket && item.fd == fd_;
}
int rebuild ();
// Used to check whether the object is a socket_poller.
@ -111,17 +131,6 @@ class socket_poller_t
// Signaler used for thread safe sockets polling
signaler_t *_signaler;
typedef struct item_t
{
socket_base_t *socket;
fd_t fd;
void *user_data;
short events;
#if defined ZMQ_POLL_BASED_ON_POLL
int pollfd_index;
#endif
} item_t;
// List of sockets
typedef std::vector<item_t> items_t;
items_t _items;