8#ifndef INCLUDED_BSLMT_THREADUTILIMPL_PTHREAD
9#define INCLUDED_BSLMT_THREADUTILIMPL_PTHREAD
86#include <bslscm_version.h>
90#ifdef BSLMT_PLATFORM_POSIX_THREADS
101#include <bsl_string.h>
105#ifdef BSLS_PLATFORM_OS_LINUX
106#include <sys/syscall.h>
110#ifdef BSLS_PLATFORM_OS_SOLARIS
121 typedef void *(*bslmt_ThreadFunction)(
void *);
132template <
class THREAD_POLICY>
133struct ThreadUtilImpl;
142struct ThreadUtilImpl<Platform::PosixThreads> {
145 typedef pthread_t Handle;
146 typedef pthread_t NativeHandle;
147 typedef pthread_t Id;
148 typedef pthread_key_t Key;
151 static const pthread_t INVALID_HANDLE;
170 static int create(Handle *threadHandle,
171 const ThreadAttributes& attributes,
187 static int create(Handle *threadHandle,
197 static int detach(Handle& threadHandle);
205 static void exit(
void *status);
214 static int getMaxSchedulingPriority(
224 static int getMinSchedulingPriority(
231 static void getThreadName(
bsl::string *threadName);
239 static int join(Handle& threadHandle,
void **status = (
void**)0);
253 static int microSleep(
int microseconds,
313 bool retryOnSignalInterrupt
327 static bool areEqual(
const Handle& a,
const Handle& b);
331 static bool areEqualId(
const Id& a,
const Id& b);
349 static int idAsInt(
const Id& threadId);
356 static NativeHandle nativeHandle(
const Handle& threadHandle);
360 static Handle self();
397 static Id handleToId(
const Handle& threadHandle);
413 static int deleteKey(Key& key);
420 static void *getSpecific(
const Key& key);
425 static int setSpecific(
const Key& key,
const void *value);
429 static unsigned int hardwareConcurrency();
443int ThreadUtilImpl<bslmt::Platform::PosixThreads>::create(
444 Handle *threadHandle,
448 ThreadAttributes attr;
449 return create(threadHandle, attr, function, userData);
453int ThreadUtilImpl<bslmt::Platform::PosixThreads>::detach(Handle& threadHandle)
455 return pthread_detach(threadHandle);
459void ThreadUtilImpl<bslmt::Platform::PosixThreads>::exit(
void *status)
461 pthread_exit(status);
465int ThreadUtilImpl<bslmt::Platform::PosixThreads>::join(Handle& threadHandle,
468 return pthread_join(threadHandle, status);
472int ThreadUtilImpl<bslmt::Platform::PosixThreads>::sleepUntil(
476 return sleepUntil(absoluteTime,
false, clockType);
480void ThreadUtilImpl<bslmt::Platform::PosixThreads>::yield()
488bool ThreadUtilImpl<bslmt::Platform::PosixThreads>::areEqual(
const Handle& a,
491 return pthread_equal(a, b);
495bool ThreadUtilImpl<bslmt::Platform::PosixThreads>::areEqualId(
const Id& a,
498 return pthread_equal(a, b);
502ThreadUtilImpl<bslmt::Platform::PosixThreads>::Id
503ThreadUtilImpl<bslmt::Platform::PosixThreads>::handleToId(
504 const Handle& threadHandle)
511ThreadUtilImpl<bslmt::Platform::PosixThreads>::idAsUint64(
const Id& threadId)
513#ifdef BSLS_PLATFORM_OS_DARWIN
522ThreadUtilImpl<bslmt::Platform::PosixThreads>::idAsInt(
const Id& threadId)
527 return static_cast<int>(idAsUint64(threadId));
531ThreadUtilImpl<bslmt::Platform::PosixThreads>::NativeHandle
532ThreadUtilImpl<bslmt::Platform::PosixThreads>::nativeHandle(
533 const Handle& threadHandle)
539ThreadUtilImpl<bslmt::Platform::PosixThreads>::Handle
540ThreadUtilImpl<bslmt::Platform::PosixThreads>::self()
542 return pthread_self();
546ThreadUtilImpl<bslmt::Platform::PosixThreads>::Id
547ThreadUtilImpl<bslmt::Platform::PosixThreads>::selfId()
549 return pthread_self();
554ThreadUtilImpl<bslmt::Platform::PosixThreads>::selfIdAsInt()
556 return idAsInt(selfId());
561ThreadUtilImpl<bslmt::Platform::PosixThreads>::selfIdAsUint64()
563 return idAsUint64(selfId());
568ThreadUtilImpl<bslmt::Platform::PosixThreads>::selfKernelIdAsUint64()
570#if defined(BSLS_PLATFORM_OS_LINUX)
572#elif defined(BSLS_PLATFORM_OS_SOLARIS)
575 return selfIdAsUint64();
582int ThreadUtilImpl<bslmt::Platform::PosixThreads>::createKey(
586 return pthread_key_create(key,destructor);
590int ThreadUtilImpl<bslmt::Platform::PosixThreads>::deleteKey(Key& key)
592 return pthread_key_delete(key);
596void *ThreadUtilImpl<bslmt::Platform::PosixThreads>::getSpecific(
599 return pthread_getspecific(key);
603int ThreadUtilImpl<bslmt::Platform::PosixThreads>::setSpecific(
607 return pthread_setspecific(key, value);
Definition bslstl_string.h:1252
SchedulingPolicy
Definition bslmt_threadattributes.h:381
Definition bsls_timeinterval.h:307
Definition bslstl_stringref.h:374
void(* bslmt_KeyDestructorFunction)(void *)
Definition bslmt_threadutil.h:363
void *(* bslmt_ThreadFunction)(void *)
Definition bslmt_threadutil.h:357
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
Definition bslmt_barrier.h:344
Enum
Definition bsls_systemclocktype.h:119
@ e_REALTIME
Definition bsls_systemclocktype.h:122
unsigned long long Uint64
Definition bsls_types.h:139