summaryrefslogtreecommitdiff
path: root/src/thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/thread.cpp')
-rw-r--r--src/thread.cpp83
1 files changed, 35 insertions, 48 deletions
diff --git a/src/thread.cpp b/src/thread.cpp
index 602ca8b..12a72e2 100644
--- a/src/thread.cpp
+++ b/src/thread.cpp
@@ -1,19 +1,20 @@
/*
- Copyright (c) 2007-2010 iMatix Corporation
+ Copyright (c) 2007-2011 iMatix Corporation
+ Copyright (c) 2007-2011 Other contributors as noted in the AUTHORS file
This file is part of 0MQ.
0MQ is free software; you can redistribute it and/or modify it under
- the terms of the Lesser GNU General Public License as published by
+ the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
0MQ is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- Lesser GNU General Public License for more details.
+ GNU Lesser General Public License for more details.
- You should have received a copy of the Lesser GNU General Public License
+ You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
@@ -23,12 +24,22 @@
#ifdef ZMQ_HAVE_WINDOWS
+extern "C"
+{
+ static unsigned int __stdcall thread_routine (void *arg_)
+ {
+ zmq::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_;
arg =arg_;
descriptor = (HANDLE) _beginthreadex (NULL, 0,
- &zmq::thread_t::thread_routine, this, 0 , NULL);
+ &::thread_routine, this, 0 , NULL);
win_assert (descriptor != NULL);
}
@@ -38,27 +49,30 @@ void zmq::thread_t::stop ()
win_assert (rc != WAIT_FAILED);
}
-zmq::thread_t::id_t zmq::thread_t::id ()
-{
- return GetCurrentThreadId ();
-}
+#else
-bool zmq::thread_t::equal (id_t id1_, id_t id2_)
-{
- return id1_ == id2_;
-}
+#include <signal.h>
-unsigned int __stdcall zmq::thread_t::thread_routine (void *arg_)
+extern "C"
{
- thread_t *self = (thread_t*) arg_;
- self->tfn (self->arg);
- return 0;
+ 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;
+ }
}
-#else
-
-#include <signal.h>
-
void zmq::thread_t::start (thread_fn *tfn_, void *arg_)
{
tfn = tfn_;
@@ -73,33 +87,6 @@ void zmq::thread_t::stop ()
errno_assert (rc == 0);
}
-zmq::thread_t::id_t zmq::thread_t::id ()
-{
- return pthread_self ();
-}
-
-bool zmq::thread_t::equal (id_t id1_, id_t id2_)
-{
- return pthread_equal (id1_, id2_) != 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