From 2a79a943de417679c562cd4a917e1d1bc19b0d25 Mon Sep 17 00:00:00 2001 From: Martin Lucina Date: Thu, 18 Feb 2010 19:38:15 +0100 Subject: Add NetBSD support --- configure.in | 13 +++++++++++++ src/atomic_bitmap.hpp | 16 ++++++++-------- src/atomic_counter.hpp | 14 +++++++------- src/atomic_ptr.hpp | 14 +++++++------- src/ip.cpp | 11 ++--------- src/ip.hpp | 10 ++++++++++ src/kqueue.cpp | 17 ++++++++++++++--- src/kqueue.hpp | 3 ++- src/poll.cpp | 3 ++- src/poll.hpp | 3 ++- src/poller.hpp | 2 ++ src/tcp_listener.cpp | 2 +- src/uuid.cpp | 2 +- src/uuid.hpp | 4 ++-- src/zmq.cpp | 6 ++++-- 15 files changed, 77 insertions(+), 43 deletions(-) diff --git a/configure.in b/configure.in index 314372a..20cd8c5 100644 --- a/configure.in +++ b/configure.in @@ -154,6 +154,19 @@ case "${host_os}" in AC_DEFINE(ZMQ_HAVE_OSX, 1, [Have DarwinOSX OS]) 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" 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 #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 #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 #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 diff --git a/src/ip.cpp b/src/ip.cpp index 822e359..b3ad610 100644 --- a/src/ip.cpp +++ b/src/ip.cpp @@ -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 @@ -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. diff --git a/src/ip.hpp b/src/ip.hpp index 9d9f5c0..ffab2f2 100644 --- a/src/ip.hpp +++ b/src/ip.hpp @@ -30,6 +30,16 @@ #include #include #include + +// 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 #include @@ -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 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 #include 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 #include 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/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 #include diff --git a/src/uuid.hpp b/src/uuid.hpp index 001ea94..00424ed 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 #elif defined ZMQ_HAVE_LINUX || defined ZMQ_HAVE_SOLARIS || defined ZMQ_HAVE_OSX #include @@ -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 #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); -- cgit v1.2.3