00001 /******************************************************************************* 00002 * Copyright (C) 2004 Vintela, Inc. All rights reserved. 00003 * Copyright (C) 2005 Novell, Inc. All rights reserved. 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * - Redistributions of source code must retain the above copyright notice, 00009 * this list of conditions and the following disclaimer. 00010 * 00011 * - Redistributions in binary form must reproduce the above copyright notice, 00012 * this list of conditions and the following disclaimer in the documentation 00013 * and/or other materials provided with the distribution. 00014 * 00015 * - Neither the name of Vintela, Inc., Novell, Inc., nor the names of its 00016 * contributors may be used to endorse or promote products derived from this 00017 * software without specific prior written permission. 00018 * 00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00022 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc., Novell, Inc., OR THE 00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 00026 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 00027 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 00028 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 00029 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00030 *******************************************************************************/ 00031 00032 00038 #ifndef BLOCXX_THREADIMPL_HPP_INCLUDE_GUARD_ 00039 #define BLOCXX_THREADIMPL_HPP_INCLUDE_GUARD_ 00040 #include "blocxx/BLOCXX_config.h" 00041 #include "blocxx/Types.hpp" 00042 #include "blocxx/ThreadTypes.hpp" 00043 00044 // The classes and functions defined in this file are not meant for general 00045 // use, they are internal implementation details. They may change at any time. 00046 00047 namespace BLOCXX_NAMESPACE 00048 { 00049 00050 /*---------------------------------- 00051 * Definitions to support threading. 00052 -----------------------------------*/ 00053 #define BLOCXX_THREAD_FLG_JOINABLE 0x000000001 00054 typedef Int32 (*ThreadFunction)(void*); 00061 namespace ThreadImpl 00062 { 00074 BLOCXX_COMMON_API int createThread(Thread_t& handle, ThreadFunction func, 00075 void* funcParm, UInt32 threadFlags); 00081 BLOCXX_COMMON_API void destroyThread(Thread_t& handle); 00088 inline bool sameThreads(const volatile Thread_t& handle1, 00089 const volatile Thread_t& handle2) 00090 { 00091 #if defined(BLOCXX_WIN32) 00092 return handle1 == handle2; 00093 #elif BLOCXX_HAVE_PTHREAD_H 00094 return pthread_equal(handle1, handle2); 00095 #endif 00096 } 00104 BLOCXX_COMMON_API void exitThread(Thread_t& handle, Int32 rval); 00108 inline Thread_t currentThread() 00109 { 00110 #if defined(BLOCXX_WIN32) 00111 return GetCurrentThreadId(); 00112 #else 00113 return pthread_self(); 00114 #endif 00115 } 00116 00117 00126 BLOCXX_COMMON_API UInt64 thread_t_ToUInt64(Thread_t thr); 00127 00136 BLOCXX_COMMON_API int setThreadDetached(Thread_t& handle); 00145 BLOCXX_COMMON_API int joinThread(Thread_t& handle, Int32& rval); 00150 BLOCXX_COMMON_API void yield(); 00156 BLOCXX_COMMON_API void sleep(UInt32 milliSeconds); 00160 inline BLOCXX_DEPRECATED void memoryBarrier() 00161 { 00162 // DEC/COMPAQ/HP Alpha 00163 #if defined(__alpha) 00164 __asm__ __volatile__("mb"); 00165 #endif 00166 00167 // Intel Itanium 00168 #if defined(__ia64__) || defined(__ia64) 00169 __asm__ __volatile__("mf"); 00170 #endif 00171 } 00199 BLOCXX_COMMON_API void testCancel(); 00200 BLOCXX_COMMON_API void saveThreadInTLS(void* pTheThread); 00201 BLOCXX_COMMON_API void sendSignalToThread(Thread_t threadID, int signo); 00202 BLOCXX_COMMON_API void cancel(Thread_t threadID); 00203 }; 00204 00205 } // end namespace BLOCXX_NAMESPACE 00206 00207 #endif