diff options
-rw-r--r-- | src/pgm_socket.cpp | 31 | ||||
-rw-r--r-- | src/zmq.cpp | 47 |
2 files changed, 47 insertions, 31 deletions
diff --git a/src/pgm_socket.cpp b/src/pgm_socket.cpp index 64bf02f..1eeb34f 100644 --- a/src/pgm_socket.cpp +++ b/src/pgm_socket.cpp @@ -82,34 +82,6 @@ int zmq::pgm_socket_t::init (bool udp_encapsulation_, const char *network_) int rc; GError *pgm_error = NULL; - // Init PGM transport if not already done. - // Ensure threading enabled, ensure timer enabled and find PGM protocol id. - // - // Note that if you want to use gettimeofday and sleep for openPGM timing, - // set environment variables PGM_TIMER to "GTOD" - // and PGM_SLEEP to "USLEEP". - if (!pgm_supported ()) { - rc = pgm_init (&pgm_error); - if (rc != TRUE) { - if (pgm_error->domain == PGM_IF_ERROR && ( - pgm_error->code == PGM_IF_ERROR_INVAL || - pgm_error->code == PGM_IF_ERROR_XDEV || - pgm_error->code == PGM_IF_ERROR_NODEV || - pgm_error->code == PGM_IF_ERROR_NOTUNIQ || - pgm_error->code == PGM_IF_ERROR_ADDRFAMILY || - pgm_error->code == PGM_IF_ERROR_FAMILY || - pgm_error->code == PGM_IF_ERROR_NODATA || - pgm_error->code == PGM_IF_ERROR_NONAME || - pgm_error->code == PGM_IF_ERROR_SERVICE)) { - errno = EINVAL; - g_error_free (pgm_error); - return -1; - } - - zmq_assert (false); - } - } - // PGM transport GSI. pgm_gsi_t gsi; @@ -137,7 +109,6 @@ int zmq::pgm_socket_t::init (bool udp_encapsulation_, const char *network_) hint.ti_family = AF_INET; if (!pgm_if_get_transport_info (network, &hint, &res, &pgm_error)) { - if (pgm_error->domain == PGM_IF_ERROR && ( pgm_error->code == PGM_IF_ERROR_INVAL || pgm_error->code == PGM_IF_ERROR_XDEV || @@ -148,8 +119,8 @@ int zmq::pgm_socket_t::init (bool udp_encapsulation_, const char *network_) pgm_error->code == PGM_IF_ERROR_NODATA || pgm_error->code == PGM_IF_ERROR_NONAME || pgm_error->code == PGM_IF_ERROR_SERVICE)) { + g_error_free (pgm_error); errno = EINVAL; - g_error_free (pgm_error); return -1; } diff --git a/src/zmq.cpp b/src/zmq.cpp index c40be65..6870ed9 100644 --- a/src/zmq.cpp +++ b/src/zmq.cpp @@ -45,6 +45,10 @@ #include <sys/time.h> #endif +#if defined ZMQ_HAVE_OPENPGM +#include <pgm/pgm.h> +#endif + const char *zmq_strerror (int errnum_) { switch (errnum_) { @@ -213,6 +217,37 @@ void *zmq_init (int app_threads_, int io_threads_, int flags_) return NULL; } +#if defined ZMQ_HAVE_OPENPGM + // Unfortunately, OpenPGM doesn't support refcounted init/shutdown, thus, + // let's fail if it was initialised beforehand. + zmq_assert (!pgm_supported ()); + + // Init PGM transport. Ensure threading and timer are enabled. Find PGM + // protocol ID. Note that if you want to use gettimeofday and sleep for + // openPGM timing, set environment variables PGM_TIMER to "GTOD" and + // PGM_SLEEP to "USLEEP". + GError *pgm_error = NULL; + int rc = pgm_init (&pgm_error); + if (rc != TRUE) { + if (pgm_error->domain == PGM_IF_ERROR && ( + pgm_error->code == PGM_IF_ERROR_INVAL || + pgm_error->code == PGM_IF_ERROR_XDEV || + pgm_error->code == PGM_IF_ERROR_NODEV || + pgm_error->code == PGM_IF_ERROR_NOTUNIQ || + pgm_error->code == PGM_IF_ERROR_ADDRFAMILY || + pgm_error->code == PGM_IF_ERROR_FAMILY || + pgm_error->code == PGM_IF_ERROR_NODATA || + pgm_error->code == PGM_IF_ERROR_NONAME || + pgm_error->code == PGM_IF_ERROR_SERVICE)) { + g_error_free (pgm_error); + errno = EINVAL; + return NULL; + } + zmq_assert (false); + } +#endif + + // Create 0MQ context. zmq::dispatcher_t *dispatcher = new (std::nothrow) zmq::dispatcher_t ( app_threads_, io_threads_, flags_); zmq_assert (dispatcher); @@ -221,7 +256,17 @@ void *zmq_init (int app_threads_, int io_threads_, int flags_) int zmq_term (void *dispatcher_) { - return ((zmq::dispatcher_t*) dispatcher_)->term (); + int rc = ((zmq::dispatcher_t*) dispatcher_)->term (); + int en = errno; + +#if defined ZMQ_HAVE_OPENPGM + // Shut down the OpenPGM library. + if (pgm_shutdown () != TRUE) + zmq_assert (false); +#endif + + errno = en; + return rc; } void *zmq_socket (void *dispatcher_, int type_) |