From e645fc2693acc796304498909786b7b47005b429 Mon Sep 17 00:00:00 2001 From: Martin Lucina Date: Mon, 23 Jan 2012 08:53:35 +0100 Subject: Imported Upstream version 2.1.3 --- src/thread.cpp | 83 +++++++++++++++++++++++++--------------------------------- 1 file changed, 35 insertions(+), 48 deletions(-) (limited to 'src/thread.cpp') 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 . */ @@ -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 -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 - 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 -- cgit v1.2.3