From 34968771ca6f9851281912dc4d2341e8064d24d1 Mon Sep 17 00:00:00 2001 From: somdoron Date: Sun, 16 Aug 2015 10:42:11 +0300 Subject: [PATCH] add an option to check if the socket is thread safe --- include/zmq.h | 1 + src/socket_base.cpp | 13 +++++++++++++ tests/test_thread_safe.cpp | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/include/zmq.h b/include/zmq.h index 5996f701..4a492ae9 100644 --- a/include/zmq.h +++ b/include/zmq.h @@ -322,6 +322,7 @@ ZMQ_EXPORT uint32_t zmq_msg_get_routing_id(zmq_msg_t *msg); #define ZMQ_XPUB_VERBOSE_UNSUBSCRIBE 78 #define ZMQ_CONNECT_TIMEOUT 79 #define ZMQ_TCP_RETRANSMIT_TIMEOUT 80 +#define ZMQ_THREAD_SAFE 81 /* Message options */ #define ZMQ_MORE 1 diff --git a/src/socket_base.cpp b/src/socket_base.cpp index 7b9de954..f53bc59f 100644 --- a/src/socket_base.cpp +++ b/src/socket_base.cpp @@ -423,6 +423,19 @@ int zmq::socket_base_t::getsockopt (int option_, void *optval_, return 0; } + if (option_ == ZMQ_THREAD_SAFE) { + if (*optvallen_ < sizeof (int)) { + errno = EINVAL; + EXIT_MUTEX(); + return -1; + } + memset(optval_, 0, *optvallen_); + *((int*) optval_) = thread_safe ? 1 : 0; + *optvallen_ = sizeof (int); + EXIT_MUTEX(); + return 0; + } + int rc = options.getsockopt (option_, optval_, optvallen_); EXIT_MUTEX(); return rc; diff --git a/tests/test_thread_safe.cpp b/tests/test_thread_safe.cpp index dee9830a..3410260e 100644 --- a/tests/test_thread_safe.cpp +++ b/tests/test_thread_safe.cpp @@ -41,6 +41,13 @@ int main (void) void *client = zmq_socket (ctx, ZMQ_CLIENT); void *client2 = zmq_socket (ctx, ZMQ_CLIENT); + int thread_safe; + size_t size = sizeof(int); + + zmq_getsockopt (client, ZMQ_THREAD_SAFE, &thread_safe, &size); + + assert (thread_safe == 1); + int rc; rc = zmq_bind (client, "tcp://127.0.0.1:5560");