8#ifndef INCLUDED_BSLMT_THREADUTILIMPL_WIN32
9#define INCLUDED_BSLMT_THREADUTILIMPL_WIN32
86#include <bslscm_version.h>
90#ifdef BSLMT_PLATFORM_WIN32_THREADS
102#include <bsl_string.h>
104typedef unsigned long DWORD;
110 __declspec(dllimport)
void __stdcall Sleep(
114 __declspec(dllimport) DWORD __stdcall SleepEx(
115 DWORD dwMilliseconds,
119 __declspec(dllimport) DWORD __stdcall GetCurrentThreadId(
123 __declspec(dllimport) HANDLE __stdcall GetCurrentThread(
127 __declspec(dllimport)
void* __stdcall TlsGetValue(
131 __declspec(dllimport) BOOL __stdcall TlsSetValue(
145 typedef void *(*bslmt_ThreadFunction)(
void *);
156template <
class THREAD_POLICY>
157struct ThreadUtilImpl;
166struct ThreadUtilImpl<Platform::Win32Threads> {
183 typedef HANDLE NativeHandle;
193 static const Handle INVALID_HANDLE;
207 static int create(Handle *thread,
208 const ThreadAttributes& attribute,
224 static int create(Handle *thread,
235 static int getMinSchedulingPriority(
245 static int getMaxSchedulingPriority(
252 static void getThreadName(
bsl::string *threadName);
260 static int join(Handle& thread,
void **status = 0);
285 static void microSleep(
int microseconds,
int seconds = 0);
309 static void exit(
void *status);
316 static Handle self();
324 static int detach(Handle& threadHandle);
331 static NativeHandle nativeHandle(
const Handle& threadHandle);
335 static bool areEqual(
const Handle& a,
const Handle& b);
371 static Id handleToId(
const Handle& threadHandle);
389 static int idAsInt(
const Id& threadId);
393 static bool areEqualId(
const Id& a,
const Id& b);
406 static int deleteKey(Key& key);
413 static void *getSpecific(
const Key& key);
417 static int setSpecific(
const Key& key,
const void *value);
421 static unsigned int hardwareConcurrency();
428bool operator==(
const ThreadUtilImpl<Platform::Win32Threads>::Handle& lhs,
429 const ThreadUtilImpl<Platform::Win32Threads>::Handle& rhs);
433bool operator!=(
const ThreadUtilImpl<Platform::Win32Threads>::Handle& lhs,
434 const ThreadUtilImpl<Platform::Win32Threads>::Handle& rhs);
447int ThreadUtilImpl<bslmt::Platform::Win32Threads>::
454int ThreadUtilImpl<bslmt::Platform::Win32Threads>::
461void ThreadUtilImpl<bslmt::Platform::Win32Threads>::yield()
467void ThreadUtilImpl<bslmt::Platform::Win32Threads>::sleep(
474 ::Sleep(milliSeconds);
478void ThreadUtilImpl<bslmt::Platform::Win32Threads>::microSleep(
482 enum { k_MILLION = 1000 * 1000 };
485 (microsecs % k_MILLION) * 1000);
489 ::Sleep(milliSeconds);
493ThreadUtilImpl<bslmt::Platform::Win32Threads>::Handle
494ThreadUtilImpl<bslmt::Platform::Win32Threads>::self()
497 h.d_id = GetCurrentThreadId();
498 h.d_handle = GetCurrentThread();
503ThreadUtilImpl<bslmt::Platform::Win32Threads>::NativeHandle
504ThreadUtilImpl<bslmt::Platform::Win32Threads>::nativeHandle(
505 const Handle& handle)
507 return handle.d_handle;
511ThreadUtilImpl<bslmt::Platform::Win32Threads>::Id
512ThreadUtilImpl<bslmt::Platform::Win32Threads>::selfId()
514 return GetCurrentThreadId();
519ThreadUtilImpl<bslmt::Platform::Win32Threads>::selfIdAsInt()
521 return idAsInt(selfId());
526ThreadUtilImpl<bslmt::Platform::Win32Threads>::selfIdAsUint64()
528 return idAsUint64(selfId());
533ThreadUtilImpl<bslmt::Platform::Win32Threads>::selfKernelIdAsUint64()
535 return selfIdAsUint64();
539ThreadUtilImpl<bslmt::Platform::Win32Threads>::Id
540ThreadUtilImpl<bslmt::Platform::Win32Threads>::handleToId(
541 const Handle& threadHandle)
543 return threadHandle.d_id;
548ThreadUtilImpl<bslmt::Platform::Win32Threads>::idAsUint64(
555int ThreadUtilImpl<bslmt::Platform::Win32Threads>::idAsInt(
558 return static_cast<int>(threadId);
562bool ThreadUtilImpl<bslmt::Platform::Win32Threads>::areEqualId(
570void *ThreadUtilImpl<bslmt::Platform::Win32Threads>::getSpecific(
573 return TlsGetValue(key);
577int ThreadUtilImpl<bslmt::Platform::Win32Threads>::setSpecific(
581 return 0 == TlsSetValue(key, (
void*)value) ? 1 : 0;
Definition bslstl_string.h:1252
SchedulingPolicy
Definition bslmt_threadattributes.h:381
@ e_UNSET_PRIORITY
Definition bslmt_threadattributes.h:411
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
bool operator!=(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
bool operator==(const FileCleanerConfiguration &lhs, const FileCleanerConfiguration &rhs)
ALLOCATOR const STRING_VIEW_LIKE_TYPE & rhs
Definition bslstl_string.h:3918
ALLOCATOR & lhs
Definition bslstl_string.h:3917
Definition bslmt_barrier.h:344
bool operator==(const ThreadAttributes &lhs, const ThreadAttributes &rhs)
bool operator!=(const ThreadAttributes &lhs, const ThreadAttributes &rhs)
static void toMillisec(unsigned int *dst, const bsls::TimeInterval &src)
Definition bslmt_entrypointfunctoradapter.h:221
Enum
Definition bsls_systemclocktype.h:119
@ e_REALTIME
Definition bsls_systemclocktype.h:122
unsigned long long Uint64
Definition bsls_types.h:139