// xthreads.h internal header // Copyright (c) Microsoft Corporation. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception #ifndef _THR_XTHREADS_H #define _THR_XTHREADS_H #include #if _STL_COMPILER_PREPROCESSOR #include #include #include #pragma pack(push, _CRT_PACKING) #pragma warning(push, _STL_WARNING_LEVEL) #pragma warning(disable : _STL_DISABLED_WARNINGS) _STL_DISABLE_CLANG_WARNINGS #pragma push_macro("new") #undef new extern "C" { using _Thrd_id_t = unsigned int; struct _Thrd_t { // thread identifier for Win32 void* _Hnd; // Win32 HANDLE _Thrd_id_t _Id; }; using _Smtx_t = void*; struct _Stl_critical_section { void* _Unused = nullptr; // TRANSITION, ABI: was the vptr _Smtx_t _M_srw_lock = nullptr; }; struct _Mtx_internal_imp_t { #if defined(_CRT_WINDOWS) || defined(UNDOCKED_WINDOWS_UCRT) #ifdef _WIN64 static constexpr size_t _Critical_section_size = 16; #else // ^^^ defined(_WIN64) / !defined(_WIN64) vvv static constexpr size_t _Critical_section_size = 8; #endif // ^^^ !defined(_WIN64) ^^^ #else // ^^^ Windows private STL / public STL vvv #ifdef _WIN64 static constexpr size_t _Critical_section_size = 64; #else // ^^^ defined(_WIN64) / !defined(_WIN64) vvv static constexpr size_t _Critical_section_size = 36; #endif // ^^^ !defined(_WIN64) ^^^ #endif // ^^^ public STL ^^^ static constexpr size_t _Critical_section_align = alignof(void*); int _Type{}; union { _Stl_critical_section _Critical_section{}; _STD _Aligned_storage_t<_Critical_section_size, _Critical_section_align> _Cs_storage; }; long _Thread_id{}; int _Count{}; }; // Size and alignment for _Cnd_internal_imp_t #if defined(_CRT_WINDOWS) // for Windows-internal code _INLINE_VAR constexpr size_t _Cnd_internal_imp_size = 2 * sizeof(void*); #elif defined(_WIN64) // ordinary 64-bit code _INLINE_VAR constexpr size_t _Cnd_internal_imp_size = 72; #else // vvv ordinary 32-bit code vvv _INLINE_VAR constexpr size_t _Cnd_internal_imp_size = 40; #endif // ^^^ ordinary 32-bit code ^^^ _INLINE_VAR constexpr size_t _Cnd_internal_imp_alignment = alignof(void*); using _Mtx_t = _Mtx_internal_imp_t*; #ifdef _M_CEE // avoid warning LNK4248: unresolved typeref token for '_Cnd_internal_imp_t'; image may not run using _Cnd_t = void*; #else // ^^^ defined(_M_CEE) / !defined(_M_CEE) vvv struct _Cnd_internal_imp_t; using _Cnd_t = _Cnd_internal_imp_t*; #endif // ^^^ !defined(_M_CEE) ^^^ enum class _Thrd_result : int { _Success, _Nomem, _Timedout, _Busy, _Error }; // threads _CRTIMP2_PURE _Thrd_result __cdecl _Thrd_detach(_Thrd_t) noexcept; _CRTIMP2_PURE _Thrd_result __cdecl _Thrd_join(_Thrd_t, int*) noexcept; _CRTIMP2_PURE void __cdecl _Thrd_yield() noexcept; _CRTIMP2_PURE unsigned int __cdecl _Thrd_hardware_concurrency() noexcept; _CRTIMP2_PURE _Thrd_id_t __cdecl _Thrd_id() noexcept; void __stdcall _Thrd_sleep_for(unsigned long /*ms*/) noexcept; // mutexes enum { // mutex types _Mtx_plain = 0x01, _Mtx_try = 0x02, _Mtx_timed = 0x04, _Mtx_recursive = 0x100 }; #ifdef _CRTBLD _CRTIMP2_PURE _Thrd_result __cdecl _Mtx_init(_Mtx_t*, int) noexcept; _CRTIMP2_PURE void __cdecl _Mtx_destroy(_Mtx_t) noexcept; #endif // _CRTBLD _CRTIMP2_PURE void __cdecl _Mtx_init_in_situ(_Mtx_t, int) noexcept; _CRTIMP2_PURE void __cdecl _Mtx_destroy_in_situ(_Mtx_t) noexcept; _CRTIMP2_PURE int __cdecl _Mtx_current_owns(_Mtx_t) noexcept; _CRTIMP2_PURE _Thrd_result __cdecl _Mtx_lock(_Mtx_t) noexcept; _CRTIMP2_PURE _Thrd_result __cdecl _Mtx_trylock(_Mtx_t) noexcept; _CRTIMP2_PURE _Thrd_result __cdecl _Mtx_unlock(_Mtx_t) noexcept; // TRANSITION, ABI: Always succeeds // shared mutex // these declarations must be in sync with those in sharedmutex.cpp void __cdecl _Smtx_lock_exclusive(_Smtx_t*) noexcept; void __cdecl _Smtx_lock_shared(_Smtx_t*) noexcept; int __cdecl _Smtx_try_lock_exclusive(_Smtx_t*) noexcept; int __cdecl _Smtx_try_lock_shared(_Smtx_t*) noexcept; void __cdecl _Smtx_unlock_exclusive(_Smtx_t*) noexcept; void __cdecl _Smtx_unlock_shared(_Smtx_t*) noexcept; // condition variables #ifdef _CRTBLD _CRTIMP2_PURE _Thrd_result __cdecl _Cnd_init(_Cnd_t*) noexcept; _CRTIMP2_PURE void __cdecl _Cnd_destroy(_Cnd_t) noexcept; #endif // _CRTBLD _CRTIMP2_PURE void __cdecl _Cnd_init_in_situ(_Cnd_t) noexcept; _CRTIMP2_PURE void __cdecl _Cnd_destroy_in_situ(_Cnd_t) noexcept; _CRTIMP2_PURE _Thrd_result __cdecl _Cnd_wait(_Cnd_t, _Mtx_t) noexcept; // TRANSITION, ABI: Always succeeds _CRTIMP2_PURE _Thrd_result __cdecl _Cnd_timedwait(_Cnd_t, _Mtx_t, const _timespec64*) noexcept; _CRTIMP2_PURE _Thrd_result __cdecl _Cnd_broadcast(_Cnd_t) noexcept; // TRANSITION, ABI: Always succeeds _CRTIMP2_PURE _Thrd_result __cdecl _Cnd_signal(_Cnd_t) noexcept; // TRANSITION, ABI: Always succeeds _CRTIMP2_PURE void __cdecl _Cnd_register_at_thread_exit(_Cnd_t, _Mtx_t, int*) noexcept; _CRTIMP2_PURE void __cdecl _Cnd_unregister_at_thread_exit(_Mtx_t) noexcept; _CRTIMP2_PURE void __cdecl _Cnd_do_broadcast_at_thread_exit() noexcept; } // extern "C" _STD_BEGIN enum { // constants for error codes _DEVICE_OR_RESOURCE_BUSY, _INVALID_ARGUMENT, _NO_SUCH_PROCESS, _NOT_ENOUGH_MEMORY, _OPERATION_NOT_PERMITTED, _RESOURCE_DEADLOCK_WOULD_OCCUR, _RESOURCE_UNAVAILABLE_TRY_AGAIN }; extern "C++" [[noreturn]] _CRTIMP2_PURE void __cdecl _Throw_Cpp_error(int _Code); _STD_END #pragma pop_macro("new") _STL_RESTORE_CLANG_WARNINGS #pragma warning(pop) #pragma pack(pop) #endif // _STL_COMPILER_PREPROCESSOR #endif // _THR_XTHREADS_H /* * This file is derived from software bearing the following * restrictions: * * (c) Copyright William E. Kempf 2001 * * Permission to use, copy, modify, distribute and sell this * software and its documentation for any purpose is hereby * granted without fee, provided that the above copyright * notice appear in all copies and that both that copyright * notice and this permission notice appear in supporting * documentation. William E. Kempf makes no representations * about the suitability of this software for any purpose. * It is provided "as is" without express or implied warranty. */