windows.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. // -*- C++ -*-
  2. //===----------------------------------------------------------------------===//
  3. //
  4. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  5. // See https://llvm.org/LICENSE.txt for license information.
  6. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  7. //
  8. //===----------------------------------------------------------------------===//
  9. #ifndef _LIBCPP___THREAD_SUPPORT_WINDOWS_H
  10. #define _LIBCPP___THREAD_SUPPORT_WINDOWS_H
  11. #include <__chrono/duration.h>
  12. #include <__config>
  13. #include <ctime>
  14. #ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
  15. # pragma GCC system_header
  16. #endif
  17. _LIBCPP_BEGIN_NAMESPACE_STD
  18. using __libcpp_timespec_t = ::timespec;
  19. //
  20. // Mutex
  21. //
  22. typedef void* __libcpp_mutex_t;
  23. #define _LIBCPP_MUTEX_INITIALIZER 0
  24. #if defined(_M_IX86) || defined(__i386__) || defined(_M_ARM) || defined(__arm__)
  25. typedef void* __libcpp_recursive_mutex_t[6];
  26. #elif defined(_M_AMD64) || defined(__x86_64__) || defined(_M_ARM64) || defined(__aarch64__)
  27. typedef void* __libcpp_recursive_mutex_t[5];
  28. #else
  29. # error Unsupported architecture
  30. #endif
  31. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t* __m);
  32. _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int
  33. __libcpp_recursive_mutex_lock(__libcpp_recursive_mutex_t* __m);
  34. _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS bool
  35. __libcpp_recursive_mutex_trylock(__libcpp_recursive_mutex_t* __m);
  36. _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int
  37. __libcpp_recursive_mutex_unlock(__libcpp_recursive_mutex_t* __m);
  38. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_recursive_mutex_destroy(__libcpp_recursive_mutex_t* __m);
  39. _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_mutex_lock(__libcpp_mutex_t* __m);
  40. _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS bool __libcpp_mutex_trylock(__libcpp_mutex_t* __m);
  41. _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int __libcpp_mutex_unlock(__libcpp_mutex_t* __m);
  42. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_mutex_destroy(__libcpp_mutex_t* __m);
  43. //
  44. // Condition variable
  45. //
  46. typedef void* __libcpp_condvar_t;
  47. #define _LIBCPP_CONDVAR_INITIALIZER 0
  48. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_condvar_signal(__libcpp_condvar_t* __cv);
  49. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_condvar_broadcast(__libcpp_condvar_t* __cv);
  50. _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int
  51. __libcpp_condvar_wait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m);
  52. _LIBCPP_EXPORTED_FROM_ABI _LIBCPP_NO_THREAD_SAFETY_ANALYSIS int
  53. __libcpp_condvar_timedwait(__libcpp_condvar_t* __cv, __libcpp_mutex_t* __m, __libcpp_timespec_t* __ts);
  54. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_condvar_destroy(__libcpp_condvar_t* __cv);
  55. //
  56. // Execute once
  57. //
  58. typedef void* __libcpp_exec_once_flag;
  59. #define _LIBCPP_EXEC_ONCE_INITIALIZER 0
  60. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_execute_once(__libcpp_exec_once_flag* __flag, void (*__init_routine)());
  61. //
  62. // Thread id
  63. //
  64. typedef long __libcpp_thread_id;
  65. _LIBCPP_EXPORTED_FROM_ABI bool __libcpp_thread_id_equal(__libcpp_thread_id __t1, __libcpp_thread_id __t2);
  66. _LIBCPP_EXPORTED_FROM_ABI bool __libcpp_thread_id_less(__libcpp_thread_id __t1, __libcpp_thread_id __t2);
  67. //
  68. // Thread
  69. //
  70. #define _LIBCPP_NULL_THREAD 0U
  71. typedef void* __libcpp_thread_t;
  72. _LIBCPP_EXPORTED_FROM_ABI bool __libcpp_thread_isnull(const __libcpp_thread_t* __t);
  73. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_thread_create(__libcpp_thread_t* __t, void* (*__func)(void*), void* __arg);
  74. _LIBCPP_EXPORTED_FROM_ABI __libcpp_thread_id __libcpp_thread_get_current_id();
  75. _LIBCPP_EXPORTED_FROM_ABI __libcpp_thread_id __libcpp_thread_get_id(const __libcpp_thread_t* __t);
  76. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_thread_join(__libcpp_thread_t* __t);
  77. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_thread_detach(__libcpp_thread_t* __t);
  78. _LIBCPP_EXPORTED_FROM_ABI void __libcpp_thread_yield();
  79. _LIBCPP_EXPORTED_FROM_ABI void __libcpp_thread_sleep_for(const chrono::nanoseconds& __ns);
  80. //
  81. // Thread local storage
  82. //
  83. typedef long __libcpp_tls_key;
  84. #define _LIBCPP_TLS_DESTRUCTOR_CC __stdcall
  85. _LIBCPP_EXPORTED_FROM_ABI int
  86. __libcpp_tls_create(__libcpp_tls_key* __key, void(_LIBCPP_TLS_DESTRUCTOR_CC* __at_exit)(void*));
  87. _LIBCPP_EXPORTED_FROM_ABI void* __libcpp_tls_get(__libcpp_tls_key __key);
  88. _LIBCPP_EXPORTED_FROM_ABI int __libcpp_tls_set(__libcpp_tls_key __key, void* __p);
  89. _LIBCPP_END_NAMESPACE_STD
  90. #endif // _LIBCPP___THREAD_SUPPORT_WINDOWS_H