diff options
-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" |