From d0e01b4bb25600dd3552660e25755466433b5ba1 Mon Sep 17 00:00:00 2001 From: Luca Boccassi Date: Mon, 12 Feb 2018 08:01:03 +0000 Subject: [PATCH] Problem: regression with "select" on *nix (#2940) * Problem: build failure with select as polling mechanism Solution: cast mailbox_handle argument to (poller_t::handle_t) like in the reaper thread class. * Problem: build failure due to INT_MAX use without include Solution: include limits and climits in src/select.cpp where INT_MAX is used * Problem: build failure due to unused variable in select.cpp Solution: move the declaration of int rc inside the ifdef block where it is actually used * Problem: reference to wrong variable in select.cpp breaks build Solution: fix it * Problem: family_entry_t constructor has no body, build fails on *nix Solution: add empty inline function in the struct * Problem: no test coverage for poll and select Solution: add Travis jobs for them on Linux * Problem: Travis jobs cannot run in container infra Solution: set sudo: false as it is not required anymore --- .travis.yml | 6 +++++- ci_build.sh | 4 ++++ src/io_thread.cpp | 2 +- src/select.cpp | 7 ++++--- src/select.hpp | 4 ++++ 5 files changed, 18 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index feb4ed3c..b87f722d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -92,8 +92,12 @@ matrix: - llvm-toolchain-trusty-5.0 packages: - clang-5.0 + - env: BUILD_TYPE=default POLLER=poll + os: linux + - env: BUILD_TYPE=default POLLER=select + os: linux -sudo: required +sudo: false before_install: - if [ $TRAVIS_OS_NAME == "osx" -a $BUILD_TYPE == "android" ] ; then brew update; brew install binutils ; fi diff --git a/ci_build.sh b/ci_build.sh index eeec76db..7a8a39f0 100755 --- a/ci_build.sh +++ b/ci_build.sh @@ -48,6 +48,10 @@ if [ $BUILD_TYPE == "default" ]; then CONFIG_OPTS+=("--with-norm=yes") fi + if [ -n "$POLLER" ]; then + CONFIG_OPTS+=("--with-poller=${POLLER}") + fi + if [ -z $DRAFT ] || [ $DRAFT == "disabled" ]; then CONFIG_OPTS+=("--enable-drafts=no") elif [ $DRAFT == "enabled" ]; then diff --git a/src/io_thread.cpp b/src/io_thread.cpp index 4b25bc34..7c8b3e20 100644 --- a/src/io_thread.cpp +++ b/src/io_thread.cpp @@ -38,7 +38,7 @@ zmq::io_thread_t::io_thread_t (ctx_t *ctx_, uint32_t tid_) : object_t (ctx_, tid_), - mailbox_handle (NULL) + mailbox_handle ((poller_t::handle_t) NULL) { poller = new (std::nothrow) poller_t (*ctx_); alloc_assert (poller); diff --git a/src/select.cpp b/src/select.cpp index e6945846..c0887bd0 100644 --- a/src/select.cpp +++ b/src/select.cpp @@ -48,6 +48,8 @@ #include "i_poll_events.hpp" #include +#include +#include zmq::select_t::select_t (const zmq::ctx_t &ctx_) : ctx (ctx_), @@ -211,7 +213,7 @@ void zmq::select_t::rm_fd (handle_t handle_) #else fd_entries_t::iterator fd_entry_it = find_fd_entry_by_handle (family_entry.fd_entries, handle_); - assert (fd_entry_it != fd_entries.end ()); + assert (fd_entry_it != family_entry.fd_entries.end ()); zmq_assert (fd_entry_it->fd != retired_fd); fd_entry_it->fd = retired_fd; @@ -321,8 +323,6 @@ void zmq::select_t::loop () (long) (timeout % 1000 * 1000)}; #endif - int rc = 0; - #if defined ZMQ_HAVE_WINDOWS /* On Windows select does not allow to mix descriptors from different @@ -340,6 +340,7 @@ void zmq::select_t::loop () */ // If there is just one family, there is no reason to use WSA events. + int rc = 0; const bool use_wsa_events = family_entries.size () > 1; if (use_wsa_events) { // TODO: I don't really understand why we are doing this. If any of diff --git a/src/select.hpp b/src/select.hpp index ed85ee37..d97f5922 100644 --- a/src/select.hpp +++ b/src/select.hpp @@ -115,7 +115,11 @@ class select_t : public poller_base_t struct family_entry_t { +#ifndef ZMQ_HAVE_WINDOWS + family_entry_t () {}; +#else family_entry_t (); +#endif fd_entries_t fd_entries; fds_set_t fds_set;