diff options
-rw-r--r-- | AUTHORS | 2 | ||||
-rw-r--r-- | COPYING.LESSER | 17 | ||||
-rw-r--r-- | Makefile.am | 2 | ||||
-rw-r--r-- | bindings/ruby/extconf.rb | 8 | ||||
-rw-r--r-- | bindings/ruby/rbzmq.cpp | 75 | ||||
-rw-r--r-- | builds/msvc/platform.hpp | 5 | ||||
-rw-r--r-- | configure.in | 69 | ||||
-rw-r--r-- | doc/Makefile.am | 3 | ||||
-rw-r--r-- | perf/ruby/local_lat.rb | 4 | ||||
-rw-r--r-- | perf/ruby/local_thr.rb | 6 | ||||
-rw-r--r-- | perf/ruby/remote_lat.rb | 4 | ||||
-rw-r--r-- | perf/ruby/remote_thr.rb | 4 | ||||
-rw-r--r-- | src/atomic_bitmap.hpp | 16 | ||||
-rw-r--r-- | src/atomic_counter.hpp | 14 | ||||
-rw-r--r-- | src/atomic_ptr.hpp | 14 | ||||
-rw-r--r-- | src/ip.cpp | 11 | ||||
-rw-r--r-- | src/ip.hpp | 10 | ||||
-rw-r--r-- | src/kqueue.cpp | 17 | ||||
-rw-r--r-- | src/kqueue.hpp | 3 | ||||
-rw-r--r-- | src/poll.cpp | 3 | ||||
-rw-r--r-- | src/poll.hpp | 3 | ||||
-rw-r--r-- | src/poller.hpp | 2 | ||||
-rw-r--r-- | src/rep.cpp | 22 | ||||
-rw-r--r-- | src/socket_base.cpp | 28 | ||||
-rw-r--r-- | src/tcp_listener.cpp | 2 | ||||
-rw-r--r-- | src/uuid.cpp | 2 | ||||
-rw-r--r-- | src/uuid.hpp | 4 | ||||
-rw-r--r-- | src/zmq.cpp | 6 |
28 files changed, 222 insertions, 134 deletions
@@ -4,6 +4,7 @@ Contributors Alexej Lotz Asko Kauppi Barak Amar +Chris Wong Conrad D. Steenberg Dhruva Krishnamurthy Dirk O. Kaar @@ -18,6 +19,7 @@ Martin Hurton Martin Lucina Martin Sustrik Matus Hamorsky +McClain Looney Pavel Gushcha Pavol Malosek Steven McCoy diff --git a/COPYING.LESSER b/COPYING.LESSER index 3f7b8b1..53a8195 100644 --- a/COPYING.LESSER +++ b/COPYING.LESSER @@ -1,4 +1,4 @@ - GNU LESSER GENERAL PUBLIC LICENSE + GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> @@ -164,3 +164,18 @@ apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. + + + + + SPECIAL EXCEPTION GRANTED BY IMATIX + +As a special exception, iMatix gives you permission to link this library with +independent modules to produce an executable, regardless of the license terms +of these independent modules, and to copy and distribute the resulting +executable under terms of your choice, provided that you also meet, for each +linked independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from or based on +this library. If you modify this library, you must extend this exception to your +version of the library. + diff --git a/Makefile.am b/Makefile.am index 51f6128..b4145c4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,6 +14,6 @@ $(top_srcdir)/foreign/xmlParser/xmlParser.hpp dist-hook: -rm -rf $(distdir)/foreign/openpgm/@pgm_basename@ -clean-local: +distclean-local: -rm -rf $(top_srcdir)/foreign/openpgm/@pgm_basename@ diff --git a/bindings/ruby/extconf.rb b/bindings/ruby/extconf.rb index d5778d0..30c70fb 100644 --- a/bindings/ruby/extconf.rb +++ b/bindings/ruby/extconf.rb @@ -18,7 +18,11 @@ require 'mkmf' dir_config('libzmq') -have_library('libzmq') -create_makefile("ruby") +if have_library('libzmq', 'zmq_init') + puts "Cool, I found your zmq install..." + create_makefile("zmq") +else + raise "Couldn't find zmq library. try setting --with-zmq-dir=<path> to tell me where it is." +end diff --git a/bindings/ruby/rbzmq.cpp b/bindings/ruby/rbzmq.cpp index fce749c..9683de4 100644 --- a/bindings/ruby/rbzmq.cpp +++ b/bindings/ruby/rbzmq.cpp @@ -69,8 +69,8 @@ static VALUE socket_initialize (VALUE self_, VALUE context_, VALUE type_) { assert (!DATA_PTR (self_)); - if (strcmp (rb_obj_classname (context_), "Context") != 0) { - rb_raise (rb_eArgError, "expected Context object"); + if (strcmp (rb_obj_classname (context_), "ZMQ::Context") != 0) { + rb_raise (rb_eArgError, "expected ZMQ::Context object"); return Qnil; } @@ -103,7 +103,7 @@ static VALUE socket_setsockopt (VALUE self_, VALUE option_, long optval = FIX2LONG (optval_); // Forward the code to native 0MQ library. - rc = zmq_setsockopt (DATA_PTR (self_), NUM2INT (option_), + rc = zmq_setsockopt (DATA_PTR (self_), NUM2INT (option_), (void *) &optval, 4); } break; @@ -113,8 +113,8 @@ static VALUE socket_setsockopt (VALUE self_, VALUE option_, case ZMQ_UNSUBSCRIBE: // Forward the code to native 0MQ library. - rc = zmq_setsockopt (DATA_PTR (self_), NUM2INT (option_), - (void *) StringValueCStr (optval_), RSTRING_LEN (optval_)); + rc = zmq_setsockopt (DATA_PTR (self_), NUM2INT (option_), + (void *) StringValueCStr (optval_), RSTRING_LEN (optval_)); break; default: @@ -170,7 +170,7 @@ static VALUE socket_send (VALUE self_, VALUE msg_, VALUE flags_) return Qnil; } memcpy (zmq_msg_data (&msg), RSTRING_PTR (msg_), RSTRING_LEN (msg_)); - + rc = zmq_send (DATA_PTR (self_), &msg, NUM2INT (flags_)); if (rc != 0 && errno == EAGAIN) { rc = zmq_msg_close (&msg); @@ -233,13 +233,16 @@ static VALUE socket_recv (VALUE self_, VALUE flags_) } extern "C" void Init_librbzmq () -{ - VALUE context_type = rb_define_class ("Context", rb_cObject); +{ + VALUE zmq_module = rb_define_module ("ZMQ"); + VALUE context_type = rb_define_class_under (zmq_module, "Context", + rb_cObject); rb_define_alloc_func (context_type, context_alloc); rb_define_method (context_type, "initialize", (VALUE(*)(...)) context_initialize, 3); - VALUE socket_type = rb_define_class ("Socket", rb_cObject); + VALUE socket_type = rb_define_class_under (zmq_module, "Socket", + rb_cObject); rb_define_alloc_func (socket_type, socket_alloc); rb_define_method (socket_type, "initialize", (VALUE(*)(...)) socket_initialize, 2); @@ -256,31 +259,31 @@ extern "C" void Init_librbzmq () rb_define_method (socket_type, "recv", (VALUE(*)(...)) socket_recv, 1); - rb_define_global_const ("HWM", INT2NUM (ZMQ_HWM)); - rb_define_global_const ("LWM", INT2NUM (ZMQ_LWM)); - rb_define_global_const ("SWAP", INT2NUM (ZMQ_SWAP)); - rb_define_global_const ("AFFINITY", INT2NUM (ZMQ_AFFINITY)); - rb_define_global_const ("IDENTITY", INT2NUM (ZMQ_IDENTITY)); - rb_define_global_const ("SUBSCRIBE", INT2NUM (ZMQ_SUBSCRIBE)); - rb_define_global_const ("UNSUBSCRIBE", INT2NUM (ZMQ_UNSUBSCRIBE)); - rb_define_global_const ("RATE", INT2NUM (ZMQ_RATE)); - rb_define_global_const ("RECOVERY_IVL", INT2NUM (ZMQ_RECOVERY_IVL)); - rb_define_global_const ("MCAST_LOOP", INT2NUM (ZMQ_MCAST_LOOP)); - rb_define_global_const ("SNDBUF", INT2NUM (ZMQ_SNDBUF)); - rb_define_global_const ("RCVBUF", INT2NUM (ZMQ_RCVBUF)); - - rb_define_global_const ("NOBLOCK", INT2NUM (ZMQ_NOBLOCK)); - rb_define_global_const ("NOFLUSH", INT2NUM (ZMQ_NOFLUSH)); - - rb_define_global_const ("P2P", INT2NUM (ZMQ_P2P)); - rb_define_global_const ("SUB", INT2NUM (ZMQ_SUB)); - rb_define_global_const ("PUB", INT2NUM (ZMQ_PUB)); - rb_define_global_const ("REQ", INT2NUM (ZMQ_REQ)); - rb_define_global_const ("REP", INT2NUM (ZMQ_REP)); - rb_define_global_const ("XREQ", INT2NUM (ZMQ_XREQ)); - rb_define_global_const ("XREP", INT2NUM (ZMQ_XREP)); - rb_define_global_const ("UPSTREAM", INT2NUM (ZMQ_UPSTREAM)); - rb_define_global_const ("DOWNSTREAM", INT2NUM (ZMQ_DOWNSTREAM)); - - rb_define_global_const ("POLL", INT2NUM (ZMQ_POLL)); + rb_define_const (zmq_module, "HWM", INT2NUM (ZMQ_HWM)); + rb_define_const (zmq_module, "LWM", INT2NUM (ZMQ_LWM)); + rb_define_const (zmq_module, "SWAP", INT2NUM (ZMQ_SWAP)); + rb_define_const (zmq_module, "AFFINITY", INT2NUM (ZMQ_AFFINITY)); + rb_define_const (zmq_module, "IDENTITY", INT2NUM (ZMQ_IDENTITY)); + rb_define_const (zmq_module, "SUBSCRIBE", INT2NUM (ZMQ_SUBSCRIBE)); + rb_define_const (zmq_module, "UNSUBSCRIBE", INT2NUM (ZMQ_UNSUBSCRIBE)); + rb_define_const (zmq_module, "RATE", INT2NUM (ZMQ_RATE)); + rb_define_const (zmq_module, "RECOVERY_IVL", INT2NUM (ZMQ_RECOVERY_IVL)); + rb_define_const (zmq_module, "MCAST_LOOP", INT2NUM (ZMQ_MCAST_LOOP)); + rb_define_const (zmq_module, "SNDBUF", INT2NUM (ZMQ_SNDBUF)); + rb_define_const (zmq_module, "RCVBUF", INT2NUM (ZMQ_RCVBUF)); + + rb_define_const (zmq_module, "NOBLOCK", INT2NUM (ZMQ_NOBLOCK)); + rb_define_const (zmq_module, "NOFLUSH", INT2NUM (ZMQ_NOFLUSH)); + + rb_define_const (zmq_module, "P2P", INT2NUM (ZMQ_P2P)); + rb_define_const (zmq_module, "SUB", INT2NUM (ZMQ_SUB)); + rb_define_const (zmq_module, "PUB", INT2NUM (ZMQ_PUB)); + rb_define_const (zmq_module, "REQ", INT2NUM (ZMQ_REQ)); + rb_define_const (zmq_module, "REP", INT2NUM (ZMQ_REP)); + rb_define_const (zmq_module, "XREQ", INT2NUM (ZMQ_XREQ)); + rb_define_const (zmq_module, "XREP", INT2NUM (ZMQ_XREP)); + rb_define_const (zmq_module, "UPSTREAM", INT2NUM (ZMQ_UPSTREAM)); + rb_define_const (zmq_module, "DOWNSTREAM", INT2NUM (ZMQ_DOWNSTREAM)); + + rb_define_const (zmq_module, "POLL", INT2NUM (ZMQ_POLL)); } diff --git a/builds/msvc/platform.hpp b/builds/msvc/platform.hpp index 483f88f..6d59329 100644 --- a/builds/msvc/platform.hpp +++ b/builds/msvc/platform.hpp @@ -25,6 +25,11 @@ // zmq directory to take place of platform.hpp generated from // platform.hpp.in on platforms supported by GNU autotools. +// 0MQ version information +#define PACKAGE_VERSION_MAJOR 2 +#define PACKAGE_VERSION_MINOR 0 +#define PACKAGE_VERSION_PATCH 6 + #define ZMQ_HAVE_WINDOWS #define _WINSOCKAPI_ #define NOMINMAX diff --git a/configure.in b/configure.in index 49266c7..20cd8c5 100644 --- a/configure.in +++ b/configure.in @@ -55,8 +55,14 @@ AC_PROG_SED AC_PROG_AWK # Checks for libraries. -AC_CHECK_LIB(pthread, pthread_create) -AC_CHECK_LIB(stdc++, malloc) +AC_CHECK_LIB([pthread], [pthread_create]) +# If using GNU C++, libstdc++ must be available. +if test "x$GXX" = "xyes"; then + # libstdc++ depends on libm on some platforms + AC_CHECK_LIB([m], [main]) + AC_CHECK_LIB([stdc++], [main], , + [AC_MSG_ERROR([cannot link with -lstdc++])]) +fi # Extra CXXFLAGS are appended at the end of CXXFLAGS for libzmq. LIBZMQ_EXTRA_CXXFLAGS="" @@ -77,9 +83,9 @@ on_mingw32="no" AC_CANONICAL_HOST # Determine whether or not documentation should be built. -build_doc="yes" +build_doc="no" install_man="yes" -if test ! -f "doc/zmq.html"; then +if test -d ".git"; then # We are building from git. # Check for asciidoc and xmlto and don't build the docs if these are not installed. AC_CHECK_PROG(have_asciidoc, asciidoc, yes, no) @@ -88,25 +94,40 @@ if test ! -f "doc/zmq.html"; then build_doc="no" install_man="no" AC_MSG_WARN([You are building from git and asciidoc is not installed. Documentation will not be built or installed.]) + else + build_doc="yes" fi fi +AC_MSG_CHECKING([whether to build documentation]) +AC_MSG_RESULT([$build_doc]) +AC_MSG_CHECKING([whether to install manpages]) +if test ! -f "./doc/zmq.7"; then + AC_MSG_ERROR([configure thinks we want to install manpages but they're not present. Help!]) +fi +AC_MSG_RESULT([$install_man]) +# Set some default features required by 0MQ code. +CPPFLAGS="-D_REENTRANT -D_THREAD_SAFE $CPPFLAGS" + +# OS-specific tests case "${host_os}" in *linux*) + # Define on Linux to enable all library features + CPPFLAGS="-D_GNU_SOURCE $CPPFLAGS" AC_DEFINE(ZMQ_HAVE_LINUX, 1, [Have Linux OS]) - CPPFLAGS="-D_REENTRANT $CPPFLAGS" AC_CHECK_LIB(uuid, main, , [AC_MSG_ERROR([cannot link with -luuid, install uuid-dev.])]) ;; *solaris*) + # Define on Solaris to enable all library features + CPPFLAGS="-D_POSIX_C_SOURCE=200112L -D_PTHREADS $CPPFLAGS" AC_DEFINE(ZMQ_HAVE_SOLARIS, 1, [Have Solaris OS]) AC_CHECK_LIB(socket, main) AC_CHECK_LIB(nsl, main) AC_CHECK_LIB(rt, main) AC_CHECK_LIB(uuid, main, , [AC_MSG_ERROR([cannot link with -luuid, install uuid-dev.])]) - CPPFLAGS="-D_REENTRANT -D_PTHREADS $CPPFLAGS" - AC_MSG_CHECKING([wheter atomic operations can be used]) + AC_MSG_CHECKING([whether atomic operations can be used]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [[#include <atomic.h>]], [[uint32_t value; @@ -121,39 +142,48 @@ case "${host_os}" in fi ;; *freebsd*) + # Define on FreeBSD to enable all library features + CPPFLAGS="-D__BSD_VISIBLE $CPPFLAGS" AC_DEFINE(ZMQ_HAVE_FREEBSD, 1, [Have FreeBSD OS]) - CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS" - LIBS="-pthread" ;; *darwin*) + # Define on Darwin to enable all library features + CPPFLAGS="-D_DARWIN_C_SOURCE $CPPFLAGS" pedantic="no" werror="no" AC_DEFINE(ZMQ_HAVE_OSX, 1, [Have DarwinOSX OS]) - LIBS="-pthread" LIBZMQ_EXTRA_CXXFLAGS+="-Wno-uninitialized" ;; + *netbsd*) + # Define on NetBSD to enable all library features + CPPFLAGS="-D_NETBSD_SOURCE $CPPFLAGS" + AC_DEFINE(ZMQ_HAVE_NETBSD, 1, [Have NetBSD OS]) + # NetBSD 5.0 and newer provides atomic operations + netbsd_has_atomic=no + # XXX As of 5.0.1 the functions declared in atomic.h are + # missing "extern C", disable this until upstream fixes it. + # AC_CHECK_HEADERS(atomic.h, [netbsd_has_atomic=yes]) + if test "x$netbsd_has_atomic" = "xno"; then + AC_DEFINE(ZMQ_FORCE_MUTEXES, 1, [Force to use mutexes]) + fi + ;; *openbsd*) + # Define on OpenBSD to enable all library features + CPPFLAGS="-D_BSD_SOURCE $CPPFLAGS" AC_DEFINE(ZMQ_HAVE_OPENBSD, 1, [Have OpenBSD OS]) - CPPFLAGS="-pthread $CPPFLAGS" - LIBS="-pthread" ;; *nto-qnx*) pedantic="no" AC_DEFINE(ZMQ_HAVE_QNXNTO, 1, [Have QNX Neutrino OS]) - CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS" AC_CHECK_LIB(socket,main) ;; *aix*) AC_DEFINE(ZMQ_HAVE_AIX, 1, [Have AIX OS]) - if test "x$GXX" = "xyes"; then - CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS" - fi ;; *hpux*) + # Define on HP-UX to enable all library features + CPPFLAGS="-D_POSIX_C_SOURCE=200112L" AC_DEFINE(ZMQ_HAVE_HPUX, 1, [Have HPUX OS]) - if test "x$GXX" = "xyes"; then - CPPFLAGS="-D_THREAD_SAFE $CPPFLAGS" - fi AC_CHECK_LIB(rt, main) ;; *mingw32*) @@ -634,7 +664,6 @@ AC_MSG_RESULT([ Queue: $queue]) AC_MSG_RESULT([ Performance tests: $perf]) AC_MSG_RESULT([ Examples:]) AC_MSG_RESULT([ Chat: $chat]) -AC_MSG_RESULT([ Documentation: $build_doc]) AC_MSG_RESULT([]) AC_MSG_RESULT([ ******************************************************** ]) AC_MSG_RESULT([]) diff --git a/doc/Makefile.am b/doc/Makefile.am index c91c808..a6fce0c 100644 --- a/doc/Makefile.am +++ b/doc/Makefile.am @@ -26,6 +26,7 @@ MAINTAINERCLEANFILES = $(MAN_DOC) $(MAN_HTML) dist-hook : $(MAN_DOC) $(MAN_HTML) +if BUILD_DOC SUFFIXES=.html .txt .xml .1 .3 .7 .txt.html: @@ -40,4 +41,4 @@ SUFFIXES=.html .txt .xml .1 .3 .7 xmlto man $< .xml.7: xmlto man $< - +endif diff --git a/perf/ruby/local_lat.rb b/perf/ruby/local_lat.rb index a299630..b27e8bc 100644 --- a/perf/ruby/local_lat.rb +++ b/perf/ruby/local_lat.rb @@ -27,8 +27,8 @@ bind_to = ARGV[0] message_size = ARGV[1].to_i roundtrip_count = ARGV[2].to_i -ctx = Context.new(1, 1, 0) -s = Socket.new(ctx, REP); +ctx = ZMQ::Context.new(1, 1, 0) +s = ZMQ::Socket.new(ctx, ZMQ::REP); s.bind(bind_to); for i in 0...roundtrip_count do diff --git a/perf/ruby/local_thr.rb b/perf/ruby/local_thr.rb index f1c0fdf..b20ca60 100644 --- a/perf/ruby/local_thr.rb +++ b/perf/ruby/local_thr.rb @@ -27,9 +27,9 @@ bind_to = ARGV[0] message_size = ARGV[1].to_i message_count = ARGV[2].to_i -ctx = Context.new(1, 1, 0) -s = Socket.new(ctx, SUB); -s.setsockopt(SUBSCRIBE, ""); +ctx = ZMQ::Context.new(1, 1, 0) +s = ZMQ::Socket.new(ctx, ZMQ::SUB); +s.setsockopt(ZMQ::SUBSCRIBE, ""); # Add your socket options here. # For example ZMQ_RATE, ZMQ_RECOVERY_IVL and ZMQ_MCAST_LOOP for PGM. diff --git a/perf/ruby/remote_lat.rb b/perf/ruby/remote_lat.rb index 7449aff..ea8cf8e 100644 --- a/perf/ruby/remote_lat.rb +++ b/perf/ruby/remote_lat.rb @@ -27,8 +27,8 @@ connect_to = ARGV[0] message_size = ARGV[1].to_i roundtrip_count = ARGV[2].to_i -ctx = Context.new(1, 1, 0) -s = Socket.new(ctx, REQ); +ctx = ZMQ::Context.new(1, 1, 0) +s = ZMQ::Socket.new(ctx, ZMQ::REQ); s.connect(connect_to); msg = "#{'0'*message_size}" diff --git a/perf/ruby/remote_thr.rb b/perf/ruby/remote_thr.rb index 9edd1c6..b2dada6 100644 --- a/perf/ruby/remote_thr.rb +++ b/perf/ruby/remote_thr.rb @@ -27,8 +27,8 @@ connect_to = ARGV[0] message_size = ARGV[1].to_i message_count = ARGV[2].to_i -ctx = Context.new(1, 1, 0) -s = Socket.new(ctx, PUB); +ctx = ZMQ::Context.new(1, 1, 0) +s = ZMQ::Socket.new(ctx, ZMQ::PUB); # Add your socket options here. # For example ZMQ_RATE, ZMQ_RECOVERY_IVL and ZMQ_MCAST_LOOP for PGM. diff --git a/src/atomic_bitmap.hpp b/src/atomic_bitmap.hpp index 6620f06..1aefd27 100644 --- a/src/atomic_bitmap.hpp +++ b/src/atomic_bitmap.hpp @@ -34,8 +34,8 @@ #define ZMQ_ATOMIC_BITMAP_SPARC #elif defined ZMQ_HAVE_WINDOWS #define ZMQ_ATOMIC_BITMAP_WINDOWS -#elif defined ZMQ_HAVE_SOLARIS -#define ZMQ_ATOMIC_BITMAP_SOLARIS +#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD) +#define ZMQ_ATOMIC_BITMAP_SYSTEM #else #define ZMQ_ATOMIC_BITMAP_MUTEX #endif @@ -44,7 +44,7 @@ #include "mutex.hpp" #elif defined ZMQ_ATOMIC_BITMAP_WINDOWS #include "windows.hpp" -#elif defined ZMQ_ATOMIC_BITMAP_SOLARIS +#elif defined ZMQ_ATOMIC_BITMAP_SYSTEM #include <atomic.h> #endif @@ -89,7 +89,7 @@ namespace zmq return (oldval & (bitmap_t (1) << reset_index_)) ? true : false; } -#elif defined ZMQ_ATOMIC_BITMAP_SOLARIS +#elif defined ZMQ_ATOMIC_BITMAP_SYSTEM while (true) { bitmap_t oldval = value; bitmap_t newval = (oldval | (bitmap_t (1) << set_index_)) & @@ -150,7 +150,7 @@ namespace zmq bitmap_t oldval; #if defined ZMQ_ATOMIC_BITMAP_WINDOWS oldval = InterlockedExchange ((volatile LONG*) &value, newval_); -#elif defined ZMQ_ATOMIC_BITMAP_SOLARIS +#elif defined ZMQ_ATOMIC_BITMAP_SYSTEM oldval = atomic_swap_32 (&value, newval_); #elif defined ZMQ_ATOMIC_BITMAP_X86 oldval = newval_; @@ -201,7 +201,7 @@ namespace zmq newval, oldval) == (LONG) oldval) return oldval; } -#elif defined ZMQ_ATOMIC_BITMAP_SOLARIS +#elif defined ZMQ_ATOMIC_BITMAP_SYSTEM while (true) { bitmap_t oldval = value; bitmap_t newval = oldval == 0 ? thenval_ : elseval_; @@ -270,8 +270,8 @@ namespace zmq #if defined ZMQ_ATOMIC_BITMAP_WINDOWS #undef ZMQ_ATOMIC_BITMAP_WINDOWS #endif -#if defined ZMQ_ATOMIC_BITMAP_SOLARIS -#undef ZMQ_ATOMIC_BITMAP_SOLARIS +#if defined ZMQ_ATOMIC_BITMAP_SYSTEM +#undef ZMQ_ATOMIC_BITMAP_SYSTEM #endif #if defined ZMQ_ATOMIC_BITMAP_X86 #undef ZMQ_ATOMIC_BITMAP_X86 diff --git a/src/atomic_counter.hpp b/src/atomic_counter.hpp index 649fdbf..4a77928 100644 --- a/src/atomic_counter.hpp +++ b/src/atomic_counter.hpp @@ -31,8 +31,8 @@ #define ZMQ_ATOMIC_COUNTER_SPARC #elif defined ZMQ_HAVE_WINDOWS #define ZMQ_ATOMIC_COUNTER_WINDOWS -#elif defined ZMQ_HAVE_SOLARIS -#define ZMQ_ATOMIC_COUNTER_SOLARIS +#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD) +#define ZMQ_ATOMIC_COUNTER_SYSTEM #else #define ZMQ_ATOMIC_COUNTER_MUTEX #endif @@ -41,7 +41,7 @@ #include "mutex.hpp" #elif defined ZMQ_ATOMIC_COUNTER_WINDOWS #include "windows.hpp" -#elif defined ZMQ_ATOMIC_COUNTER_SOLARIS +#elif defined ZMQ_ATOMIC_COUNTER_SYSTEM #include <atomic.h> #endif @@ -79,7 +79,7 @@ namespace zmq #if defined ZMQ_ATOMIC_COUNTER_WINDOWS old_value = InterlockedExchangeAdd ((LONG*) &value, increment_); -#elif defined ZMQ_ATOMIC_COUNTER_SOLARIS +#elif defined ZMQ_ATOMIC_COUNTER_SYSTEM integer_t new_value = atomic_add_32_nv (&value, increment_); old_value = new_value - increment_; #elif defined ZMQ_ATOMIC_COUNTER_X86 @@ -119,7 +119,7 @@ namespace zmq LONG delta = - ((LONG) decrement); integer_t old = InterlockedExchangeAdd ((LONG*) &value, delta); return old - decrement != 0; -#elif defined ZMQ_ATOMIC_COUNTER_SOLARIS +#elif defined ZMQ_ATOMIC_COUNTER_SYSTEM int32_t delta = - ((int32_t) decrement); integer_t nv = atomic_add_32_nv (&value, delta); return nv != 0; @@ -180,8 +180,8 @@ namespace zmq #if defined ZMQ_ATOMIC_COUNTER_WINDOWS #undef ZMQ_ATOMIC_COUNTER_WINDOWS #endif -#if defined ZMQ_ATOMIC_COUNTER_SOLARIS -#undef ZMQ_ATOMIC_COUNTER_SOLARIS +#if defined ZMQ_ATOMIC_COUNTER_SYSTEM +#undef ZMQ_ATOMIC_COUNTER_SYSTEM #endif #if defined ZMQ_ATOMIC_COUNTER_X86 #undef ZMQ_ATOMIC_COUNTER_X86 diff --git a/src/atomic_ptr.hpp b/src/atomic_ptr.hpp index 3735e99..e4a7491 100644 --- a/src/atomic_ptr.hpp +++ b/src/atomic_ptr.hpp @@ -31,8 +31,8 @@ #define ZMQ_ATOMIC_PTR_SPARC #elif defined ZMQ_HAVE_WINDOWS #define ZMQ_ATOMIC_PTR_WINDOWS -#elif defined ZMQ_HAVE_SOLARIS -#define ZMQ_ATOMIC_PTR_SOLARIS +#elif (defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_NETBSD) +#define ZMQ_ATOMIC_PTR_SYSTEM #else #define ZMQ_ATOMIC_PTR_MUTEX #endif @@ -41,7 +41,7 @@ #include "mutex.hpp" #elif defined ZMQ_ATOMIC_PTR_WINDOWS #include "windows.hpp" -#elif defined ZMQ_ATOMIC_PTR_SOLARIS +#elif defined ZMQ_ATOMIC_PTR_SYSTEM #include <atomic.h> #endif @@ -79,7 +79,7 @@ namespace zmq { #if defined ZMQ_ATOMIC_PTR_WINDOWS return (T*) InterlockedExchangePointer (&ptr, val_); -#elif defined ZMQ_ATOMIC_PTR_SOLARIS +#elif defined ZMQ_ATOMIC_PTR_SYSTEM return (T*) atomic_swap_ptr (&ptr, val_); #elif defined ZMQ_ATOMIC_PTR_X86 T *old; @@ -125,7 +125,7 @@ namespace zmq #if defined ZMQ_ATOMIC_PTR_WINDOWS return (T*) InterlockedCompareExchangePointer ( (volatile PVOID*) &ptr, val_, cmp_); -#elif defined ZMQ_ATOMIC_PTR_SOLARIS +#elif defined ZMQ_ATOMIC_PTR_SYSTEM return (T*) atomic_cas_ptr (&ptr, cmp_, val_); #elif defined ZMQ_ATOMIC_PTR_X86 T *old; @@ -173,8 +173,8 @@ namespace zmq #if defined ZMQ_ATOMIC_PTR_WINDOWS #undef ZMQ_ATOMIC_PTR_WINDOWS #endif -#if defined ZMQ_ATOMIC_PTR_SOLARIS -#undef ZMQ_ATOMIC_PTR_SOLARIS +#if defined ZMQ_ATOMIC_PTR_SYSTEM +#undef ZMQ_ATOMIC_PTR_SYSTEM #endif #if defined ZMQ_ATOMIC_PTR_X86 #undef ZMQ_ATOMIC_PTR_X86 @@ -125,7 +125,8 @@ static int resolve_nic_name (in_addr* addr_, char const *interface_) #elif ((defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD ||\ defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_OPENBSD ||\ - defined ZMQ_HAVE_QNXNTO) && defined ZMQ_HAVE_IFADDRS) + defined ZMQ_HAVE_QNXNTO || defined ZMQ_HAVE_NETBSD)\ + && defined ZMQ_HAVE_IFADDRS) #include <ifaddrs.h> @@ -239,11 +240,7 @@ int zmq::resolve_ip_interface (sockaddr_storage* addr_, socklen_t *addr_len_, // Restrict hostname/service to literals to avoid any DNS lookups or // service-name irregularity due to indeterminate socktype. -#if defined ZMQ_HAVE_OSX - req.ai_flags = AI_PASSIVE | AI_NUMERICHOST; -#else req.ai_flags = AI_PASSIVE | AI_NUMERICHOST | AI_NUMERICSERV; -#endif // Resolve the literal address. Some of the error info is lost in case // of error, however, there's no way to report EAI errors via errno. @@ -292,11 +289,7 @@ int zmq::resolve_ip_hostname (sockaddr_storage *addr_, socklen_t *addr_len_, // Avoid named services due to unclear socktype, and don't pick IPv6 // addresses if we don't have a local IPv6 address configured. -#if defined ZMQ_HAVE_OSX - req.ai_flags = AI_ADDRCONFIG; -#else req.ai_flags = AI_NUMERICSERV | AI_ADDRCONFIG; -#endif // Resolve host name. Some of the error info is lost in case of error, // however, there's no way to report EAI errors via errno. @@ -30,6 +30,16 @@ #include <arpa/inet.h> #include <netinet/in.h> #include <netdb.h> + +// Some platforms (notably Darwin/OSX and NetBSD) do not define all AI_ +// flags for getaddrinfo(). This can be worked around safely by defining +// these to 0. +#ifndef AI_ADDRCONFIG +#define AI_ADDRCONFIG 0 +#endif +#ifndef AI_NUMERICSERV +#define AI_NUMERICSERV 0 +#endif #endif #if !defined ZMQ_HAVE_WINDOWS && !defined ZMQ_HAVE_OPENVMS diff --git a/src/kqueue.cpp b/src/kqueue.cpp index bf9c8a2..e1fe2fa 100644 --- a/src/kqueue.cpp +++ b/src/kqueue.cpp @@ -19,7 +19,8 @@ #include "platform.hpp" -#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_OSX +#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_OPENBSD ||\ + defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_NETBSD #include <sys/time.h> #include <sys/types.h> @@ -34,6 +35,14 @@ #include "config.hpp" #include "i_poll_events.hpp" +// NetBSD defines (struct kevent).udata as intptr_t, everyone else +// as void *. +#if defined ZMQ_HAVE_NETBSD +#define kevent_udata_t intptr_t +#else +#define kevent_udata_t void * +#endif + zmq::kqueue_t::kqueue_t () : stopping (false) { @@ -56,7 +65,7 @@ void zmq::kqueue_t::kevent_add (fd_t fd_, short filter_, void *udata_) { struct kevent ev; - EV_SET (&ev, fd_, filter_, EV_ADD, 0, 0, udata_); + EV_SET (&ev, fd_, filter_, EV_ADD, 0, 0, (kevent_udata_t)udata_); int rc = kevent (kqueue_fd, &ev, 1, NULL, 0, NULL); errno_assert (rc != -1); } @@ -65,7 +74,7 @@ void zmq::kqueue_t::kevent_delete (fd_t fd_, short filter_) { struct kevent ev; - EV_SET (&ev, fd_, filter_, EV_DELETE, 0, 0, NULL); + EV_SET (&ev, fd_, filter_, EV_DELETE, 0, 0, (kevent_udata_t)NULL); int rc = kevent (kqueue_fd, &ev, 1, NULL, 0, NULL); errno_assert (rc != -1); } @@ -212,4 +221,6 @@ void zmq::kqueue_t::worker_routine (void *arg_) ((kqueue_t*) arg_)->loop (); } +// Don't pollute namespace with defines local to this file +#undef kevent_udata_t #endif diff --git a/src/kqueue.hpp b/src/kqueue.hpp index d2dd09a..ac28a7d 100644 --- a/src/kqueue.hpp +++ b/src/kqueue.hpp @@ -22,7 +22,8 @@ #include "platform.hpp" -#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_OSX +#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_OPENBSD ||\ + defined ZMQ_HAVE_OSX || defined ZMQ_HAVE_NETBSD #include <vector> diff --git a/src/poll.cpp b/src/poll.cpp index 889ea4a..4214195 100644 --- a/src/poll.cpp +++ b/src/poll.cpp @@ -22,7 +22,8 @@ #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_HPUX || defined ZMQ_HAVE_AIX ||\ + defined ZMQ_HAVE_NETBSD #include <sys/types.h> #include <sys/time.h> diff --git a/src/poll.hpp b/src/poll.hpp index 5b8e745..f4ae35a 100644 --- a/src/poll.hpp +++ b/src/poll.hpp @@ -25,7 +25,8 @@ #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_HPUX || defined ZMQ_HAVE_AIX ||\ + defined ZMQ_HAVE_NETBSD #include <poll.h> #include <stddef.h> diff --git a/src/poller.hpp b/src/poller.hpp index b769283..49d466b 100644 --- a/src/poller.hpp +++ b/src/poller.hpp @@ -47,6 +47,8 @@ namespace zmq typedef kqueue_t poller_t; #elif defined ZMQ_HAVE_OPENBSD typedef kqueue_t poller_t; +#elif defined ZMQ_HAVE_NETBSD + typedef kqueue_t poller_t; #elif defined ZMQ_HAVE_SOLARIS typedef devpoll_t poller_t; #elif defined ZMQ_HAVE_OSX diff --git a/src/rep.cpp b/src/rep.cpp index 968427d..755d78e 100644 --- a/src/rep.cpp +++ b/src/rep.cpp @@ -89,11 +89,11 @@ void zmq::rep_t::xdetach_outpipe (class writer_t *pipe_) out_pipes_t::size_type index = out_pipes.index (pipe_); - // TODO: If the connection we've got the request from disconnects, - // there's nowhere to send the reply. DLQ? - if (waiting_for_reply && pipe_ == reply_pipe) { - zmq_assert (false); - } + // If the connection we've got the request from disconnects, + // there's nowhere to send the reply. Forget about the reply pipe. + // Once the reply is sent it will be dropped. + if (waiting_for_reply && pipe_ == reply_pipe) + reply_pipe = NULL; // If corresponding inpipe is still in place simply nullify the pointer // to the outpipe. @@ -150,9 +150,15 @@ int zmq::rep_t::xsend (zmq_msg_t *msg_, int flags_) // overloads the buffer, connection should be torn down. zmq_assert (reply_pipe->check_write (zmq_msg_size (msg_))); - // Push message to the selected pipe. - reply_pipe->write (msg_); - reply_pipe->flush (); + // Push message to the selected pipe. If requester have disconnected + // in the meantime, drop the reply. + if (reply_pipe) { + reply_pipe->write (msg_); + reply_pipe->flush (); + } + else { + zmq_close (msg_); + } waiting_for_reply = false; reply_pipe = NULL; diff --git a/src/socket_base.cpp b/src/socket_base.cpp index 1607673..871f9e9 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -346,6 +346,7 @@ int zmq::socket_base_t::recv (::zmq_msg_t *msg_, int flags_) { // Get the message. int rc = xrecv (msg_, flags_); + int err = errno; // Once every inbound_poll_rate messages check for signals and process // incoming commands. This happens only if we are not polling altogether @@ -364,29 +365,30 @@ int zmq::socket_base_t::recv (::zmq_msg_t *msg_, int flags_) if (rc == 0) return 0; + // If we don't have the message, restore the original cause of the problem. + errno = err; + // If the message cannot be fetched immediately, there are two scenarios. // For non-blocking recv, commands are processed in case there's a revive // command already waiting int a command pipe. If it's not, return EAGAIN. - // In blocking scenario, commands are processed over and over again until - // we are able to fetch a message. if (flags_ & ZMQ_NOBLOCK) { if (errno != EAGAIN) return -1; app_thread->process_commands (false, false); - rc = xrecv (msg_, flags_); ticks = 0; - } - else { - while (rc != 0) { - if (errno != EAGAIN) - return -1; - app_thread->process_commands (true, false); - rc = xrecv (msg_, flags_); - ticks = 0; - } + return xrecv (msg_, flags_); } - return rc; + // In blocking scenario, commands are processed over and over again until + // we are able to fetch a message. + while (rc != 0) { + if (errno != EAGAIN) + return -1; + app_thread->process_commands (true, false); + rc = xrecv (msg_, flags_); + ticks = 0; + } + return 0; } int zmq::socket_base_t::close () diff --git a/src/tcp_listener.cpp b/src/tcp_listener.cpp index 3d15abe..cb84715 100644 --- a/src/tcp_listener.cpp +++ b/src/tcp_listener.cpp @@ -275,7 +275,7 @@ zmq::fd_t zmq::tcp_listener_t::accept () #if (defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_FREEBSD || \ defined ZMQ_HAVE_OPENBSD || defined ZMQ_HAVE_OSX || \ - defined ZMQ_HAVE_OPENVMS) + defined ZMQ_HAVE_OPENVMS || defined ZMQ_HAVE_NETBSD) if (sock == -1 && (errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR || errno == ECONNABORTED)) diff --git a/src/uuid.cpp b/src/uuid.cpp index 6fdb060..fa1cff4 100644 --- a/src/uuid.cpp +++ b/src/uuid.cpp @@ -47,7 +47,7 @@ const char *zmq::uuid_t::to_string () return (char*) uuid_str; } -#elif defined ZMQ_HAVE_FREEBSD +#elif defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD #include <stdlib.h> #include <uuid.h> diff --git a/src/uuid.hpp b/src/uuid.hpp index f565f8d..03bb69d 100644 --- a/src/uuid.hpp +++ b/src/uuid.hpp @@ -23,7 +23,7 @@ #include "platform.hpp" #include "stdint.hpp" -#if defined ZMQ_HAVE_FREEBSD +#if defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD #include <uuid.h> #elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_OSX #include <uuid/uuid.h> @@ -60,7 +60,7 @@ namespace zmq #endif ::UUID uuid; RPC_CSTR uuid_str; -#elif defined ZMQ_HAVE_FREEBSD +#elif defined ZMQ_HAVE_FREEBSD || defined ZMQ_HAVE_NETBSD ::uuid_t uuid; char *uuid_str; #elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_OSX diff --git a/src/zmq.cpp b/src/zmq.cpp index e6f1a61..4170b3f 100644 --- a/src/zmq.cpp +++ b/src/zmq.cpp @@ -37,7 +37,8 @@ #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_HPUX || defined ZMQ_HAVE_AIX ||\ + defined ZMQ_HAVE_NETBSD #include <poll.h> #endif @@ -325,7 +326,8 @@ int zmq_poll (zmq_pollitem_t *items_, int nitems_, long timeout_) #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_HPUX || defined ZMQ_HAVE_AIX ||\ + defined ZMQ_HAVE_NETBSD pollfd *pollfds = (pollfd*) malloc (nitems_ * sizeof (pollfd)); zmq_assert (pollfds); |