17162fd75SLouis Dionne // -*- C++ -*- 27162fd75SLouis Dionne //===----------------------------------------------------------------------===// 37162fd75SLouis Dionne // 47162fd75SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 57162fd75SLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 67162fd75SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 77162fd75SLouis Dionne // 87162fd75SLouis Dionne //===----------------------------------------------------------------------===// 97162fd75SLouis Dionne 107162fd75SLouis Dionne #ifndef _LIBCPP___THREAD_SUPPORT_WINDOWS_H 117162fd75SLouis Dionne #define _LIBCPP___THREAD_SUPPORT_WINDOWS_H 127162fd75SLouis Dionne 137162fd75SLouis Dionne #include <__chrono/duration.h> 147162fd75SLouis Dionne #include <__config> 157162fd75SLouis Dionne #include <ctime> 167162fd75SLouis Dionne 177162fd75SLouis Dionne #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER 187162fd75SLouis Dionne # pragma GCC system_header 197162fd75SLouis Dionne #endif 207162fd75SLouis Dionne 217162fd75SLouis Dionne _LIBCPP_BEGIN_NAMESPACE_STD 227162fd75SLouis Dionne 23*e1ddc333SLouis Dionne using __libcpp_timespec_t = ::timespec; 24*e1ddc333SLouis Dionne 257162fd75SLouis Dionne // 267162fd75SLouis Dionne // Mutex 277162fd75SLouis Dionne // 287162fd75SLouis Dionne typedef void* __libcpp_mutex_t; 297162fd75SLouis Dionne #define _LIBCPP_MUTEX_INITIALIZER 0 307162fd75SLouis Dionne 317162fd75SLouis Dionne #if defined(_M_IX86) || defined(__i386__) || defined(_M_ARM) || defined(__arm__) 327162fd75SLouis Dionne typedef void* __libcpp_recursive_mutex_t[6]; 337162fd75SLouis Dionne #elif defined(_M_AMD64) || defined(__x86_64__) || defined(_M_ARM64) || defined(__aarch64__) 347162fd75SLouis Dionne typedef void* __libcpp_recursive_mutex_t[5]; 357162fd75SLouis Dionne #else 367162fd75SLouis Dionne # error Unsupported architecture 377162fd75SLouis Dionne #endif 387162fd75SLouis Dionne 397162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t* __m); 407162fd75SLouis Dionne 417162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int 427162fd75SLouis Dionne __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t* __m); 437162fd75SLouis Dionne 447162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS bool 457162fd75SLouis Dionne __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t* __m); 467162fd75SLouis Dionne 477162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int 487162fd75SLouis Dionne __libcpp_recursive_mutex_unlock(__libcpp_recursive_mutex_t* __m); 497162fd75SLouis Dionne 507162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t* __m); 517162fd75SLouis Dionne 527162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_mutex_lock(__libcpp_mutex_t* __m); 537162fd75SLouis Dionne 547162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS bool __libcpp_mutex_trylock(__libcpp_mutex_t* __m); 557162fd75SLouis Dionne 567162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_mutex_unlock(__libcpp_mutex_t* __m); 577162fd75SLouis Dionne 587162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_mutex_destroy(__libcpp_mutex_t* __m); 597162fd75SLouis Dionne 607162fd75SLouis Dionne // 617162fd75SLouis Dionne // Condition variable 627162fd75SLouis Dionne // 637162fd75SLouis Dionne typedef void* __libcpp_condvar_t; 647162fd75SLouis Dionne #define _LIBCPP_CONDVAR_INITIALIZER 0 657162fd75SLouis Dionne 667162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_condvar_signal(__libcpp_condvar_t* __cv); 677162fd75SLouis Dionne 687162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv); 697162fd75SLouis Dionne 707162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int 717162fd75SLouis Dionne __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m); 727162fd75SLouis Dionne 737162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int 747162fd75SLouis Dionne __libcpp_condvar_timedwait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m, __libcpp_timespec_t* __ts); 757162fd75SLouis Dionne 767162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv); 777162fd75SLouis Dionne 787162fd75SLouis Dionne // 797162fd75SLouis Dionne // Execute once 807162fd75SLouis Dionne // 817162fd75SLouis Dionne typedef void* __libcpp_exec_once_flag; 827162fd75SLouis Dionne #define _LIBCPP_EXEC_ONCE_INITIALIZER 0 837162fd75SLouis Dionne 847162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_execute_once(__libcpp_exec_once_flag* __flag, void (*__init_routine)()); 857162fd75SLouis Dionne 867162fd75SLouis Dionne // 877162fd75SLouis Dionne // Thread id 887162fd75SLouis Dionne // 897162fd75SLouis Dionne typedef long __libcpp_thread_id; 907162fd75SLouis Dionne 917162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI bool __libcpp_thread_id_equal(__libcpp_thread_id __t1, __libcpp_thread_id __t2); 927162fd75SLouis Dionne 937162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI bool __libcpp_thread_id_less(__libcpp_thread_id __t1, __libcpp_thread_id __t2); 947162fd75SLouis Dionne 957162fd75SLouis Dionne // 967162fd75SLouis Dionne // Thread 977162fd75SLouis Dionne // 987162fd75SLouis Dionne #define _LIBCPP_NULL_THREAD 0U 997162fd75SLouis Dionne typedef void* __libcpp_thread_t; 1007162fd75SLouis Dionne 1017162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI bool __libcpp_thread_isnull(const __libcpp_thread_t* __t); 1027162fd75SLouis Dionne 1037162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_thread_create(__libcpp_thread_t* __t, void* (*__func)(void*), void* __arg); 1047162fd75SLouis Dionne 1057162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI __libcpp_thread_id __libcpp_thread_get_current_id(); 1067162fd75SLouis Dionne 1077162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI __libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t* __t); 1087162fd75SLouis Dionne 1097162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_thread_join(__libcpp_thread_t* __t); 1107162fd75SLouis Dionne 1117162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_thread_detach(__libcpp_thread_t* __t); 1127162fd75SLouis Dionne 1137162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI void __libcpp_thread_yield(); 1147162fd75SLouis Dionne 1157162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns); 1167162fd75SLouis Dionne 1177162fd75SLouis Dionne // 1187162fd75SLouis Dionne // Thread local storage 1197162fd75SLouis Dionne // 1207162fd75SLouis Dionne typedef long __libcpp_tls_key; 1217162fd75SLouis Dionne 1227162fd75SLouis Dionne #define _LIBCPP_TLS_DESTRUCTOR_CC __stdcall 1237162fd75SLouis Dionne 1247162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int 1257162fd75SLouis Dionne __libcpp_tls_create(__libcpp_tls_key* __key, void(_LIBCPP_TLS_DESTRUCTOR_CC* __at_exit)(void*)); 1267162fd75SLouis Dionne 1277162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI void* __libcpp_tls_get(__libcpp_tls_key __key); 1287162fd75SLouis Dionne 1297162fd75SLouis Dionne _LIBCPP_EXPORTED_FROM_ABI int __libcpp_tls_set(__libcpp_tls_key __key, void* __p); 1307162fd75SLouis Dionne 1317162fd75SLouis Dionne _LIBCPP_END_NAMESPACE_STD 1327162fd75SLouis Dionne 1337162fd75SLouis Dionne #endif // _LIBCPP___THREAD_SUPPORT_WINDOWS_H 134