summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/thread.cpp54
-rw-r--r--src/thread.hpp10
2 files changed, 35 insertions, 29 deletions
diff --git a/src/thread.cpp b/src/thread.cpp
index 2edd85b..874190e 100644
--- a/src/thread.cpp
+++ b/src/thread.cpp
@@ -23,6 +23,16 @@
#ifdef ZMQ_HAVE_WINDOWS
+extern "C"
+{
+ static unsigned int __stdcall thread_routine (void *arg_)
+ {
+ thread_t *self = (zmq::thread_t*) arg_;
+ self->tfn (self->arg);
+ return 0;
+ }
+}
+
void zmq::thread_t::start (thread_fn *tfn_, void *arg_)
{
tfn = tfn_;
@@ -38,17 +48,30 @@ void zmq::thread_t::stop ()
win_assert (rc != WAIT_FAILED);
}
-unsigned int __stdcall zmq::thread_t::thread_routine (void *arg_)
-{
- thread_t *self = (thread_t*) arg_;
- self->tfn (self->arg);
- return 0;
-}
-
#else
#include <signal.h>
+extern "C"
+{
+ static void *thread_routine (void *arg_)
+ {
+ #if !defined ZMQ_HAVE_OPENVMS
+ // Following code will guarantee more predictable latecnies as it'll
+ // disallow any signal handling in the I/O thread.
+ sigset_t signal_set;
+ int rc = sigfillset (&signal_set);
+ errno_assert (rc == 0);
+ rc = pthread_sigmask (SIG_BLOCK, &signal_set, NULL);
+ errno_assert (rc == 0);
+ #endif
+
+ zmq::thread_t *self = (zmq::thread_t*) arg_;
+ self->tfn (self->arg);
+ return NULL;
+ }
+}
+
void zmq::thread_t::start (thread_fn *tfn_, void *arg_)
{
tfn = tfn_;
@@ -63,23 +86,6 @@ void zmq::thread_t::stop ()
errno_assert (rc == 0);
}
-void *zmq::thread_t::thread_routine (void *arg_)
-{
-#if !defined ZMQ_HAVE_OPENVMS
- // Following code will guarantee more predictable latecnies as it'll
- // disallow any signal handling in the I/O thread.
- sigset_t signal_set;
- int rc = sigfillset (&signal_set);
- errno_assert (rc == 0);
- rc = pthread_sigmask (SIG_BLOCK, &signal_set, NULL);
- errno_assert (rc == 0);
-#endif
-
- thread_t *self = (thread_t*) arg_;
- self->tfn (self->arg);
- return NULL;
-}
-
#endif
diff --git a/src/thread.hpp b/src/thread.hpp
index 519a34a..46745a5 100644
--- a/src/thread.hpp
+++ b/src/thread.hpp
@@ -54,20 +54,20 @@ namespace zmq
// Waits for thread termination.
void stop ();
+
+ // These are internal members. They should be private, however then
+ // they would not be accessible from the main C routine of the thread.
+ thread_fn *tfn;
+ void *arg;
private:
#ifdef ZMQ_HAVE_WINDOWS
- static unsigned int __stdcall thread_routine (void *arg_);
HANDLE descriptor;
#else
- static void *thread_routine (void *arg_);
pthread_t descriptor;
#endif
- thread_fn *tfn;
- void *arg;
-
thread_t (const thread_t&);
void operator = (const thread_t&);
};