Commit aff1f662 authored by Martin Sustrik's avatar Martin Sustrik

Merge branch 'master' of git@github.com:sustrik/zeromq2

parents 75f571c8 2a79a943
......@@ -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
......
......@@ -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.
......@@ -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@
......@@ -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
......@@ -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;
}
......@@ -234,12 +234,15 @@ 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));
}
......@@ -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
......
......@@ -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([])
......
......@@ -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
......@@ -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
......
......@@ -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.
......
......@@ -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}"
......
......@@ -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.
......
......@@ -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
......
......@@ -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
......
......@@ -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
......
......@@ -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
......@@ -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>
......
......@@ -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>
......
......@@ -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>
......
......@@ -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
......
......@@ -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.
// 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;
......
......@@ -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,19 +365,22 @@ 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;
return xrecv (msg_, flags_);
}
else {
// 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;
......@@ -384,9 +388,7 @@ int zmq::socket_base_t::recv (::zmq_msg_t *msg_, int flags_)
rc = xrecv (msg_, flags_);
ticks = 0;
}
}
return rc;
return 0;
}
int zmq::socket_base_t::close ()
......
......@@ -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))
......
......@@ -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>
......
......@@ -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
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment