From f694a2d985e87c289a22711b401acadd077fa879 Mon Sep 17 00:00:00 2001 From: somdoron Date: Sat, 11 Mar 2017 10:57:29 +0200 Subject: [PATCH] problem: zmq_poll is slow because FD is being created on every call making the creation of FD only when thread safe sockets are in used within the zmq_poller which improve the zmq_poll performance. --- src/socket_poller.cpp | 25 +++++++++++++++++-------- src/socket_poller.hpp | 2 +- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/socket_poller.cpp b/src/socket_poller.cpp index 495feb06..124ff059 100644 --- a/src/socket_poller.cpp +++ b/src/socket_poller.cpp @@ -33,6 +33,7 @@ zmq::socket_poller_t::socket_poller_t () : tag (0xCAFEBABE), + signaler (NULL), need_rebuild (true), use_signaler (false), poll_size(0) @@ -62,10 +63,15 @@ zmq::socket_poller_t::~socket_poller_t () size_t thread_safe_size = sizeof(int); if (it->socket->getsockopt (ZMQ_THREAD_SAFE, &thread_safe, &thread_safe_size) == 0 && thread_safe) - it->socket->remove_signaler (&signaler); + it->socket->remove_signaler (signaler); } } + if (signaler != NULL) { + delete signaler; + signaler = NULL; + } + #if defined ZMQ_POLL_BASED_ON_POLL if (pollfds) { free (pollfds); @@ -95,7 +101,10 @@ int zmq::socket_poller_t::add (socket_base_t *socket_, void* user_data_, short e return -1; if (thread_safe) { - if (socket_->add_signaler (&signaler) == -1) + if (signaler == NULL) + signaler = new signaler_t (); + + if (socket_->add_signaler (signaler) == -1) return -1; } @@ -193,7 +202,7 @@ int zmq::socket_poller_t::remove (socket_base_t *socket_) size_t thread_safe_size = sizeof(int); if (socket_->getsockopt (ZMQ_THREAD_SAFE, &thread_safe, &thread_safe_size) == 0 && thread_safe) - socket_->remove_signaler (&signaler); + socket_->remove_signaler (signaler); return 0; } @@ -264,7 +273,7 @@ int zmq::socket_poller_t::rebuild () if (use_signaler) { item_nbr = 1; - pollfds[0].fd = signaler.get_fd(); + pollfds[0].fd = signaler->get_fd(); pollfds[0].events = POLLIN; } @@ -323,7 +332,7 @@ int zmq::socket_poller_t::rebuild () if (thread_safe && it->events) { use_signaler = true; - FD_SET (signaler.get_fd (), &pollset_in); + FD_SET (signaler->get_fd (), &pollset_in); poll_size = 1; break; } @@ -436,7 +445,7 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev // Receive the signal from pollfd if (use_signaler && pollfds[0].revents & POLLIN) - signaler.recv (); + signaler->recv (); // Check for the events. int found = 0; @@ -596,8 +605,8 @@ int zmq::socket_poller_t::wait (zmq::socket_poller_t::event_t *events_, int n_ev break; } - if (use_signaler && FD_ISSET (signaler.get_fd (), &inset)) - signaler.recv (); + if (use_signaler && FD_ISSET (signaler->get_fd (), &inset)) + signaler->recv (); // Check for the events. int found = 0; diff --git a/src/socket_poller.hpp b/src/socket_poller.hpp index 46f4f9bf..89d08f21 100644 --- a/src/socket_poller.hpp +++ b/src/socket_poller.hpp @@ -87,7 +87,7 @@ namespace zmq uint32_t tag; // Signaler used for thread safe sockets polling - signaler_t signaler; + signaler_t* signaler; typedef struct item_t { socket_base_t *socket;