101 while (!
timer.expired())
104 if (!
cond.timedWait(lock,
timer.asAbsoluteTimeout()))
116#if defined(BLOCXX_HAVE_SCHED_YIELD)
118#elif defined(BLOCXX_WIN32)
126#if defined(BLOCXX_USE_PTHREAD)
169#if !defined(BLOCXX_NCR)
174 needsSetting =
false;
179#ifdef _POSIX_THREAD_ATTR_STACKSIZE
180 pthread_attr_t stack_size_attr;
181 if (pthread_attr_init(&stack_size_attr) != 0)
185 if (pthread_attr_getstacksize(&stack_size_attr, &val) != 0)
195#ifdef PTHREAD_STACK_MIN
196 if (PTHREAD_STACK_MIN > val)
198 val = PTHREAD_STACK_MIN;
211 needsSetting =
false;
216#ifdef _POSIX_THREAD_ATTR_STACKSIZE
217 pthread_attr_t stack_size_attr;
218 if (pthread_attr_create(&stack_size_attr) != 0)
223 val = pthread_attr_getstacksize(stack_size_attr);
224 if (
static_cast<signed>(val) == -1)
232#if defined(PTHREAD_STACK_MIN) && defined(_SC_THREAD_STACK_MIN)
233 if (PTHREAD_STACK_MIN > val)
235 val = PTHREAD_STACK_MIN;
245 static bool needsSetting;
248size_t default_stack_size::val = 0;
249bool default_stack_size::needsSetting(
false);
292#if !defined(BLOCXX_NCR)
306#if !defined(BLOCXX_VALGRIND_SUPPORT)
308 if (default_stack_size::needsSetting)
332#if !defined(BLOCXX_VALGRIND_SUPPORT)
334 if (default_stack_size::needsSetting)
367#if defined(BLOCXX_SIZEOF_PTHREAD_T)
368#if BLOCXX_SIZEOF_PTHREAD_T == 2
369#define BLOCXX_THREAD_CONVERTER UInt16
370#elif BLOCXX_SIZEOF_PTHREAD_T == 4
371#define BLOCXX_THREAD_CONVERTER UInt32
372#elif BLOCXX_SIZEOF_PTHREAD_T == 8
373#define BLOCXX_THREAD_CONVERTER UInt64
376#define BLOCXX_THREAD_CONVERTER UInt16
378#error Unexpected size for pthread_t
382#error No pthread_t size was found!
393#undef BLOCXX_THREAD_CONVERTER
464 throw ThreadCancelledException();
498#if defined(BLOCXX_WIN32)
508typedef Map<DWORD, WThreadInfo> Win32ThreadMap;
509Win32ThreadMap g_threads;
512struct LocalThreadParm
520unsigned __stdcall threadStarter(
void* arg)
522 LocalThreadParm* parg =
reinterpret_cast<LocalThreadParm*
>(arg);
524 void* funcParm = parg->m_funcParm;
526 Int32 rval = (*func)(funcParm);
527 ::_endthreadex(
static_cast<unsigned>(rval));
534addThreadToMap(DWORD threadId, HANDLE threadHandle)
536 MutexLock ml(g_threadsGuard);
538 wi.handle = threadHandle;
540 g_threads[threadId] = wi;
545getThreadHandle(DWORD threadId)
547 MutexLock ml(g_threadsGuard);
549 Win32ThreadMap::iterator it = g_threads.find(threadId);
550 if (it != g_threads.end())
552 chdl = it->second.handle;
559setThreadPointer(DWORD threadId, Thread* pTheThread)
561 MutexLock ml(g_threadsGuard);
562 Win32ThreadMap::iterator it = g_threads.find(threadId);
563 if (it != g_threads.end())
565 it->second.pTheThread = pTheThread;
571removeThreadFromMap(DWORD threadId)
573 MutexLock ml(g_threadsGuard);
575 Win32ThreadMap::iterator it = g_threads.find(threadId);
576 if (it != g_threads.end())
578 chdl = it->second.handle;
586getThreadObject(DWORD threadId)
588 Thread* pTheThread = 0;
589 MutexLock ml(g_threadsGuard);
590 Win32ThreadMap::iterator it = g_threads.find(threadId);
591 if (it != g_threads.end())
593 pTheThread = it->second.pTheThread;
701 throw ThreadCancelledException();
#define BLOCXX_ASSERTMSG(CON, MSG)
BLOCXX_ASSERTMSG works the same as BLOCXX_ASSERT, but with a second string parameter that will be add...
BLOCXX_COMMON_API int createThread(Thread_t &handle, ThreadFunction func, void *funcParm, UInt32 threadFlags)
Starts a thread running the given function.