diff options
author | Martin Sustrik <sustrik@250bpm.com> | 2012-04-21 12:15:45 +0200 |
---|---|---|
committer | Martin Sustrik <sustrik@250bpm.com> | 2012-04-22 07:17:44 +0200 |
commit | 94a38c72a7c8803d0947ac86a425152a8b1895ba (patch) | |
tree | 8552d2696b5db252a18c36535f54cf7df525d507 | |
parent | 0fb5a016497d3061a6edf40752c06127f3abb796 (diff) |
Initialise fd_set once for signler_t object
Optimisation. Up to now new fd_set was initialised in
each signaler_wait call. Now the fd_set is initialised
once when signaler is created. This is useful espacially on
Windows where fd_set is list of pointers rather than bitset
and thus can be rather large.
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
-rw-r--r-- | src/polling.hpp | 4 | ||||
-rw-r--r-- | src/signaler.cpp | 39 | ||||
-rw-r--r-- | src/signaler.hpp | 25 | ||||
-rw-r--r-- | src/upoll.hpp | 4 |
4 files changed, 38 insertions, 34 deletions
diff --git a/src/polling.hpp b/src/polling.hpp index b8f0540..c0b2423 100644 --- a/src/polling.hpp +++ b/src/polling.hpp @@ -18,8 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef __XS_CORE_HPP_INCLUDED__ -#define __XS_CORE_HPP_INCLUDED__ +#ifndef __XS_POLLING_HPP_INCLUDED__ +#define __XS_POLLING_HPP_INCLUDED__ #include "platform.hpp" diff --git a/src/signaler.cpp b/src/signaler.cpp index 1f754f6..8fff9b4 100644 --- a/src/signaler.cpp +++ b/src/signaler.cpp @@ -18,31 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include "platform.hpp" -#include "polling.hpp" - -// On AIX, poll.h has to be included before xs.h to get consistent -// definition of pollfd structure (AIX uses 'reqevents' and 'retnevents' -// instead of 'events' and 'revents' and defines macros to map from POSIX-y -// names to AIX-specific names). -#if defined XS_USE_SYNC_POLL -#include <poll.h> -#elif defined XS_USE_SYNC_SELECT -#if defined XS_HAVE_WINDOWS -#include "windows.hpp" -#elif defined XS_HAVE_HPUX -#include <sys/param.h> -#include <sys/types.h> -#include <sys/time.h> -#elif defined XS_HAVE_OPENVMS -#include <sys/types.h> -#include <sys/time.h> -#else -#include <sys/select.h> -#endif -#endif - #include "signaler.hpp" +#include "platform.hpp" #include "likely.hpp" #include "stdint.hpp" #include "config.hpp" @@ -287,6 +264,11 @@ int xs::signaler_init (xs::signaler_t *self_) // Set both fds to non-blocking mode. unblock_socket (self_->w); unblock_socket (self_->r); + +#if defined XS_USE_SYNC_SELECT + FD_ZERO (&self_->fds); +#endif + return 0; } @@ -362,21 +344,18 @@ int xs::signaler_wait (xs::signaler_t *self_, int timeout_) return 0; #elif defined XS_USE_SYNC_SELECT - - fd_set fds; - FD_ZERO (&fds); - FD_SET (self_->r, &fds); + FD_SET (self_->r, &self_->fds); struct timeval timeout; if (timeout_ >= 0) { timeout.tv_sec = timeout_ / 1000; timeout.tv_usec = timeout_ % 1000 * 1000; } #ifdef XS_HAVE_WINDOWS - int rc = select (0, &fds, NULL, NULL, + int rc = select (0, &self_->fds, NULL, NULL, timeout_ >= 0 ? &timeout : NULL); wsa_assert (rc != SOCKET_ERROR); #else - int rc = select (self_->r + 1, &fds, NULL, NULL, + int rc = select (self_->r + 1, &self_->fds, NULL, NULL, timeout_ >= 0 ? &timeout : NULL); if (unlikely (rc < 0)) { xs_assert (errno == EINTR); diff --git a/src/signaler.hpp b/src/signaler.hpp index 20c2c36..a47763f 100644 --- a/src/signaler.hpp +++ b/src/signaler.hpp @@ -22,6 +22,28 @@ #define __XS_SIGNALER_HPP_INCLUDED__ #include "fd.hpp" +#include "polling.hpp" + +// On AIX, poll.h has to be included before xs.h to get consistent +// definition of pollfd structure (AIX uses 'reqevents' and 'retnevents' +// instead of 'events' and 'revents' and defines macros to map from POSIX-y +// names to AIX-specific names). +#if defined XS_USE_SYNC_POLL +#include <poll.h> +#elif defined XS_USE_SYNC_SELECT +#if defined XS_HAVE_WINDOWS +#include "windows.hpp" +#elif defined XS_HAVE_HPUX +#include <sys/param.h> +#include <sys/types.h> +#include <sys/time.h> +#elif defined XS_HAVE_OPENVMS +#include <sys/types.h> +#include <sys/time.h> +#else +#include <sys/select.h> +#endif +#endif namespace xs { @@ -34,6 +56,9 @@ namespace xs typedef struct { fd_t w; fd_t r; +#if defined XS_USE_SYNC_SELECT + fd_set fds; +#endif } signaler_t; // Initialise the signaler. diff --git a/src/upoll.hpp b/src/upoll.hpp index d63df5e..d08cf5e 100644 --- a/src/upoll.hpp +++ b/src/upoll.hpp @@ -18,8 +18,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifndef __XS_POLLING_HPP_INCLUDED__ -#define __XS_POLLING_HPP_INCLUDED__ +#ifndef __XS_UPOLL_HPP_INCLUDED__ +#define __XS_UPOLL_HPP_INCLUDED__ #include "../include/xs.h" |