diff options
| author | Martin Lucina <martin@lucina.net> | 2012-01-23 09:00:29 +0100 | 
|---|---|---|
| committer | Martin Lucina <martin@lucina.net> | 2012-01-23 09:00:29 +0100 | 
| commit | ba0336b4d129a9e261c95276f89640b3459176bf (patch) | |
| tree | a488f7efb61a6950a462815062c3b0f007f40ff5 /src | |
| parent | c3363afa881b46f3df8a6b72ed15cfbac18f4713 (diff) | |
| parent | 4016b657973bba87caf75168ba70aaa85d556487 (diff) | |
Merge commit 'upstream/2.1.11'
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.in | 3 | ||||
| -rw-r--r-- | src/clock.cpp | 12 | ||||
| -rw-r--r-- | src/device.cpp | 14 | ||||
| -rw-r--r-- | src/err.cpp | 13 | ||||
| -rw-r--r-- | src/err.hpp | 26 | ||||
| -rw-r--r-- | src/ip.cpp | 6 | ||||
| -rw-r--r-- | src/kqueue.cpp | 29 | ||||
| -rw-r--r-- | src/mailbox.cpp | 5 | ||||
| -rw-r--r-- | src/platform.hpp.in | 12 | ||||
| -rw-r--r-- | src/tcp_socket.cpp | 26 | ||||
| -rw-r--r-- | src/uuid.cpp | 14 | ||||
| -rw-r--r-- | src/uuid.hpp | 5 | ||||
| -rw-r--r-- | src/xrep.cpp | 1 | ||||
| -rw-r--r-- | src/zmq.cpp | 2 | 
14 files changed, 123 insertions, 45 deletions
| diff --git a/src/Makefile.in b/src/Makefile.in index f7a9436..8325786 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -208,6 +208,7 @@ LN_S = @LN_S@  LTLIBOBJS = @LTLIBOBJS@  LTVER = @LTVER@  MAKEINFO = @MAKEINFO@ +MANIFEST_TOOL = @MANIFEST_TOOL@  MKDIR_P = @MKDIR_P@  NM = @NM@  NMEDIT = @NMEDIT@ @@ -239,6 +240,7 @@ abs_builddir = @abs_builddir@  abs_srcdir = @abs_srcdir@  abs_top_builddir = @abs_top_builddir@  abs_top_srcdir = @abs_top_srcdir@ +ac_ct_AR = @ac_ct_AR@  ac_ct_CC = @ac_ct_CC@  ac_ct_CXX = @ac_ct_CXX@  ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ @@ -274,7 +276,6 @@ libzmq_have_asciidoc = @libzmq_have_asciidoc@  libzmq_have_xmlto = @libzmq_have_xmlto@  localedir = @localedir@  localstatedir = @localstatedir@ -lt_ECHO = @lt_ECHO@  mandir = @mandir@  mkdir_p = @mkdir_p@  oldincludedir = @oldincludedir@ diff --git a/src/clock.cpp b/src/clock.cpp index f98a2f4..f1da091 100644 --- a/src/clock.cpp +++ b/src/clock.cpp @@ -34,6 +34,10 @@  #include <sys/time.h>  #endif +#if defined HAVE_CLOCK_GETTIME +#include <time.h> +#endif +  zmq::clock_t::clock_t () :      last_tsc (rdtsc ()),      last_time (now_us () / 1000) @@ -61,6 +65,14 @@ uint64_t zmq::clock_t::now_us ()      double ticks_div = (double) (ticksPerSecond.QuadPart / 1000000);           return (uint64_t) (tick.QuadPart / ticks_div); +#elif defined HAVE_CLOCK_GETTIME + +    //  Use POSIX clock_gettime function to get precise monotonic time. +    struct timespec tv; +    int rc = clock_gettime (CLOCK_MONOTONIC, &tv); +    errno_assert (rc == 0); +    return (tv.tv_sec * (uint64_t) 1000000 + tv.tv_nsec / 1000); +  #else      //  Use POSIX gettimeofday function to get precise time. diff --git a/src/device.cpp b/src/device.cpp index 351283a..4d86e91 100644 --- a/src/device.cpp +++ b/src/device.cpp @@ -20,6 +20,20 @@  #include <stddef.h> +#include "platform.hpp" + +//  On AIX, poll.h has to be included before zmq.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 ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD ||\ +    defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_SOLARIS ||\ +    defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_QNXNTO ||\ +    defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_AIX ||\ +    defined ZMQ_HAVE_NETBSD +#include <poll.h> +#endif +  #include "../include/zmq.h"  #include "device.hpp" diff --git a/src/err.cpp b/src/err.cpp index d280487..ddc08ee 100644 --- a/src/err.cpp +++ b/src/err.cpp @@ -64,6 +64,19 @@ const char *zmq::errno_to_string (int errno_)      }  } +void zmq::zmq_abort(const char *errmsg_) +{ +#if defined ZMQ_HAVE_WINDOWS + +    //  Raise STATUS_FATAL_APP_EXIT. +    ULONG_PTR extra_info [1]; +    extra_info [0] = (ULONG_PTR) errmsg_; +    RaiseException (0x40000015, EXCEPTION_NONCONTINUABLE, 1, extra_info); +#else +    abort (); +#endif +} +  #ifdef ZMQ_HAVE_WINDOWS  const char *zmq::wsa_error() diff --git a/src/err.hpp b/src/err.hpp index 9558a10..7c7a9d8 100644 --- a/src/err.hpp +++ b/src/err.hpp @@ -42,6 +42,7 @@  namespace zmq  {      const char *errno_to_string (int errno_); +    void zmq_abort (const char *errmsg_);  }  #ifdef ZMQ_HAVE_WINDOWS @@ -51,7 +52,7 @@ namespace zmq      const char *wsa_error ();      const char *wsa_error_no (int no_);      void win_error (char *buffer_, size_t buffer_size_); -    void wsa_error_to_errno ();  +    void wsa_error_to_errno ();  }  //  Provides convenient way to check WSA-style errors on Windows. @@ -62,7 +63,7 @@ namespace zmq              if (errstr != NULL) {\                  fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \                      __FILE__, __LINE__);\ -                abort ();\ +                zmq::zmq_abort (errstr);\              }\          }\      } while (false) @@ -74,7 +75,7 @@ namespace zmq          if (errstr != NULL) {\              fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \                  __FILE__, __LINE__);\ -            abort ();\ +            zmq::zmq_abort (errstr);\          }\      } while (false) @@ -86,7 +87,7 @@ namespace zmq              zmq::win_error (errstr, 256);\              fprintf (stderr, "Assertion failed: %s (%s:%d)\n", errstr, \                  __FILE__, __LINE__);\ -            abort ();\ +            zmq::zmq_abort (errstr);\          }\      } while (false) @@ -100,7 +101,7 @@ namespace zmq          if (unlikely (!(x))) {\              fprintf (stderr, "Assertion failed: %s (%s:%d)\n", #x, \                  __FILE__, __LINE__);\ -            abort ();\ +            zmq::zmq_abort (#x);\          }\      } while (false)  @@ -108,9 +109,9 @@ namespace zmq  #define errno_assert(x) \      do {\          if (unlikely (!(x))) {\ -            perror (NULL);\ -            fprintf (stderr, "%s (%s:%d)\n", #x, __FILE__, __LINE__);\ -            abort ();\ +            const char *errstr = strerror (errno);\ +            fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\ +            zmq::zmq_abort (errstr);\          }\      } while (false) @@ -118,8 +119,9 @@ namespace zmq  #define posix_assert(x) \      do {\          if (unlikely (x)) {\ -            fprintf (stderr, "%s (%s:%d)\n", strerror (x), __FILE__, __LINE__);\ -            abort ();\ +            const char *errstr = strerror (x);\ +            fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\ +            zmq::zmq_abort (errstr);\          }\      } while (false) @@ -129,7 +131,7 @@ namespace zmq          if (unlikely (x)) {\              const char *errstr = gai_strerror (x);\              fprintf (stderr, "%s (%s:%d)\n", errstr, __FILE__, __LINE__);\ -            abort ();\ +            zmq::zmq_abort (errstr);\          }\      } while (false) @@ -139,7 +141,7 @@ namespace zmq          if (unlikely (!x)) {\              fprintf (stderr, "FATAL ERROR: OUT OF MEMORY (%s:%d)\n",\                  __FILE__, __LINE__);\ -            abort ();\ +            zmq::zmq_abort ("FATAL ERROR: OUT OF MEMORY");\          }\      } while (false) @@ -102,7 +102,7 @@ static int resolve_nic_name (in_addr* addr_, char const *interface_)      return 0;  } -#elif defined ZMQ_HAVE_AIX || ZMQ_HAVE_HPUX || ZMQ_HAVE_ANDROID +#elif defined ZMQ_HAVE_AIX || defined ZMQ_HAVE_HPUX || defined ZMQ_HAVE_ANDROID  #include <sys/ioctl.h>  #include <net/if.h> @@ -188,7 +188,7 @@ int zmq::open_socket (int domain_, int type_, int protocol_)  {      //  Setting this option result in sane behaviour when exec() functions      //  are used. Old sockets are closed and don't block TCP ports etc. -#if defined SOCK_CLOEXEC +#if defined HAVE_SOCK_CLOEXEC      type_ |= SOCK_CLOEXEC;  #endif @@ -199,7 +199,7 @@ int zmq::open_socket (int domain_, int type_, int protocol_)      //  If there's no SOCK_CLOEXEC, let's try the second best option. Note that      //  race condition can cause socket not to be closed (if fork happens      //  between socket creation and this point). -#if !defined SOCK_CLOEXEC && defined FD_CLOEXEC +#if !defined HAVE_SOCK_CLOEXEC && defined FD_CLOEXEC      int rc = fcntl (s, F_SETFD, FD_CLOEXEC);      errno_assert (rc != -1);  #endif diff --git a/src/kqueue.cpp b/src/kqueue.cpp index f173f84..fe4b65d 100644 --- a/src/kqueue.cpp +++ b/src/kqueue.cpp @@ -35,6 +35,7 @@  #include "err.hpp"  #include "config.hpp"  #include "i_poll_events.hpp" +#include "likely.hpp"  //  NetBSD defines (struct kevent).udata as intptr_t, everyone else  //  as void *. @@ -73,9 +74,7 @@ void zmq::kqueue_t::kevent_delete (fd_t fd_, short filter_)      EV_SET (&ev, fd_, filter_, EV_DELETE, 0, 0, 0);      int rc = kevent (kqueue_fd, &ev, 1, NULL, 0, NULL); - -    if (rc == -1 && errno != ENOENT) -        errno_assert (false); +    errno_assert (rc != -1);  }  zmq::kqueue_t::handle_t zmq::kqueue_t::add_fd (fd_t fd_, @@ -110,29 +109,37 @@ void zmq::kqueue_t::rm_fd (handle_t handle_)  void zmq::kqueue_t::set_pollin (handle_t handle_)  {      poll_entry_t *pe = (poll_entry_t*) handle_; -    pe->flag_pollin = true; -    kevent_add (pe->fd, EVFILT_READ, pe); +    if (likely (!pe->flag_pollin)) { +        pe->flag_pollin = true; +        kevent_add (pe->fd, EVFILT_READ, pe); +    }  }  void zmq::kqueue_t::reset_pollin (handle_t handle_)  {      poll_entry_t *pe = (poll_entry_t*) handle_; -    pe->flag_pollin = false; -    kevent_delete (pe->fd, EVFILT_READ); +    if (likely (pe->flag_pollin)) { +        pe->flag_pollin = false; +        kevent_delete (pe->fd, EVFILT_READ); +    }  }  void zmq::kqueue_t::set_pollout (handle_t handle_)  {      poll_entry_t *pe = (poll_entry_t*) handle_; -    pe->flag_pollout = true; -    kevent_add (pe->fd, EVFILT_WRITE, pe); +    if (likely (!pe->flag_pollout)) { +        pe->flag_pollout = true; +        kevent_add (pe->fd, EVFILT_WRITE, pe); +    }  }  void zmq::kqueue_t::reset_pollout (handle_t handle_)  {      poll_entry_t *pe = (poll_entry_t*) handle_; -    pe->flag_pollout = false; -    kevent_delete (pe->fd, EVFILT_WRITE); +    if (likely (pe->flag_pollout)) { +        pe->flag_pollout = false; +        kevent_delete (pe->fd, EVFILT_WRITE); +   }  }  void zmq::kqueue_t::start () diff --git a/src/mailbox.cpp b/src/mailbox.cpp index a99a9ec..24fa739 100644 --- a/src/mailbox.cpp +++ b/src/mailbox.cpp @@ -35,6 +35,11 @@ zmq::mailbox_t::mailbox_t ()  zmq::mailbox_t::~mailbox_t ()  {      //  TODO: Retrieve and deallocate commands inside the cpipe. + +    // Work around problem that other threads might still be in our +    // send() method, by waiting on the mutex before disappearing. +    sync.lock (); +    sync.unlock ();  }  zmq::fd_t zmq::mailbox_t::get_fd () diff --git a/src/platform.hpp.in b/src/platform.hpp.in index c89739d..12a5ab4 100644 --- a/src/platform.hpp.in +++ b/src/platform.hpp.in @@ -6,6 +6,9 @@  /* Define to 1 if you have the <arpa/inet.h> header file. */  #undef HAVE_ARPA_INET_H +/* Define to 1 if you have the `clock_gettime' function. */ +#undef HAVE_CLOCK_GETTIME +  /* Define to 1 if you have the <dlfcn.h> header file. */  #undef HAVE_DLFCN_H @@ -30,6 +33,9 @@  /* Define to 1 if you have the `crypto' library (-lcrypto). */  #undef HAVE_LIBCRYPTO +/* Define to 1 if you have the `dcekt' library (-ldcekt). */ +#undef HAVE_LIBDCEKT +  /* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */  #undef HAVE_LIBIPHLPAPI @@ -75,6 +81,9 @@  /* Define to 1 if you have the `socket' function. */  #undef HAVE_SOCKET +/* Whether SOCK_CLOEXEC is defined and functioning. */ +#undef HAVE_SOCK_CLOEXEC +  /* Define to 1 if stdbool.h conforms to C99. */  #undef HAVE_STDBOOL_H @@ -105,6 +114,9 @@  /* Define to 1 if you have the <sys/types.h> header file. */  #undef HAVE_SYS_TYPES_H +/* Define to 1 if you have the <time.h> header file. */ +#undef HAVE_TIME_H +  /* Define to 1 if you have the <unistd.h> header file. */  #undef HAVE_UNISTD_H diff --git a/src/tcp_socket.cpp b/src/tcp_socket.cpp index 07159d8..775a7a6 100644 --- a/src/tcp_socket.cpp +++ b/src/tcp_socket.cpp @@ -79,7 +79,7 @@ int zmq::tcp_socket_t::write (const void *data, int size)      //  we'll get an error (this may happen during the speculative write).      if (nbytes == SOCKET_ERROR && WSAGetLastError () == WSAEWOULDBLOCK)          return 0; - +		      //  Signalise peer failure.      if (nbytes == -1 && (            WSAGetLastError () == WSAENETDOWN || @@ -119,7 +119,7 @@ int zmq::tcp_socket_t::read (void *data, int size)      //  Orderly shutdown by the other peer.      if (nbytes == 0) -        return -1; +        return -1;       return (size_t) nbytes;  } @@ -200,9 +200,6 @@ int zmq::tcp_socket_t::write (const void *data, int size)      if (nbytes == -1 && (errno == ECONNRESET || errno == EPIPE))          return -1; -    if (nbytes == 1) -        fprintf (stderr, "E: unhandled error on send: %d/%s\n", -                 errno, strerror (errno));      errno_assert (nbytes != -1);      return (size_t) nbytes;  } @@ -214,18 +211,21 @@ int zmq::tcp_socket_t::read (void *data, int size)      //  Several errors are OK. When speculative read is being done we may not      //  be able to read a single byte to the socket. Also, SIGSTOP issued      //  by a debugging tool can result in EINTR error. -    if (nbytes == -1 && (errno == EAGAIN || errno == EWOULDBLOCK || -          errno == EINTR)) +    if (nbytes == -1 +    && (errno == EAGAIN +     || errno == EWOULDBLOCK +     || errno == EINTR))          return 0; -    //  Signalise peer failure. -    if (nbytes == -1 && (errno == ECONNRESET || errno == ECONNREFUSED || -          errno == ETIMEDOUT || errno == EHOSTUNREACH)) +    //  Signal peer failure. +    if (nbytes == -1 +    && (errno == ECONNRESET +     || errno == ECONNREFUSED +     || errno == ETIMEDOUT +     || errno == EHOSTUNREACH +     || errno == ENOTCONN))          return -1; -    if (nbytes == 1) -        fprintf (stderr, "E: unhandled error on recv: %d/%s\n", -                 errno, strerror (errno));      errno_assert (nbytes != -1);      //  Orderly shutdown by the other peer. diff --git a/src/uuid.cpp b/src/uuid.cpp index d8cc2e8..35d854f 100644 --- a/src/uuid.cpp +++ b/src/uuid.cpp @@ -44,14 +44,22 @@ const char *zmq::uuid_t::to_string ()      return (char*) string_buf;  } -#elif defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD +#elif defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD || (defined ZMQ_HAVE_HPUX && defined HAVE_LIBDCEKT)  #include <stdlib.h> -#include <uuid.h> +#ifdef ZMQ_HAVE_HPUX +#  include <dce/uuid.h> +#else +#  include <uuid.h> +#endif  zmq::uuid_t::uuid_t ()  { +#ifdef ZMQ_HAVE_HPUX +    unsigned32 status; +#else      uint32_t status; +#endif      uuid_create (&uuid, &status);      zmq_assert (status == uuid_s_ok);      uuid_to_string (&uuid, &string_buf, &status); @@ -67,7 +75,7 @@ zmq::uuid_t::~uuid_t ()  const char *zmq::uuid_t::to_string ()  { -    return string_buf; +    return (char*) string_buf;  }  #elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS ||\ diff --git a/src/uuid.hpp b/src/uuid.hpp index 5eab6c8..525dbcb 100644 --- a/src/uuid.hpp +++ b/src/uuid.hpp @@ -26,6 +26,8 @@  #if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD  #include <uuid.h> +#elif defined ZMQ_HAVE_HPUX && defined HAVE_LIBDCEKT +#include <dce/uuid.h>  #elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS ||\        defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_CYGWIN  #include <uuid/uuid.h> @@ -86,6 +88,9 @@ namespace zmq  #elif defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD          ::uuid_t uuid;          char *string_buf; +#elif defined ZMQ_HAVE_HPUX && defined HAVE_LIBDCEKT +        ::uuid_t uuid; +        unsigned_char_t *string_buf;  #elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS ||\        defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_CYGWIN ||\        defined ZMQ_HAVE_OPENVMS diff --git a/src/xrep.cpp b/src/xrep.cpp index ac4150d..c60d6a6 100644 --- a/src/xrep.cpp +++ b/src/xrep.cpp @@ -218,7 +218,6 @@ int zmq::xrep_t::xsend (zmq_msg_t *msg_, int flags_)          int rc = zmq_msg_close (msg_);          zmq_assert (rc == 0);      } -      //  Detach the message from the data buffer.      int rc = zmq_msg_init (msg_);      zmq_assert (rc == 0); diff --git a/src/zmq.cpp b/src/zmq.cpp index dce9630..d6363b9 100644 --- a/src/zmq.cpp +++ b/src/zmq.cpp @@ -661,7 +661,7 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_)              }  #else              int rc = select (maxfd + 1, &inset, &outset, &errset, ptimeout); -            if (unlikely (rc == -1) { +            if (unlikely (rc == -1)) {                  if (errno == EINTR || errno == EBADF)                      return -1;                  errno_assert (false); | 
