diff options
author | Martin Storsjö <martin@martin.st> | 2021-02-26 00:41:35 +0200 |
---|---|---|
committer | Martin Storsjö <martin@martin.st> | 2021-03-05 10:48:59 +0200 |
commit | 1773eec6928f4e37b377e23b84d7a2a07d0d1d0d (patch) | |
tree | 51c47a3237b9c0e385d335d3f2d7f23f1668cbba /libcxx/src | |
parent | 579fd0259788e8dcd4c2a26b5eefdd0d78cd4093 (diff) | |
download | llvm-1773eec6928f4e37b377e23b84d7a2a07d0d1d0d.zip llvm-1773eec6928f4e37b377e23b84d7a2a07d0d1d0d.tar.gz llvm-1773eec6928f4e37b377e23b84d7a2a07d0d1d0d.tar.bz2 |
[libcxx] Implement semaphores for windows
Also add WIN32_LEAN_AND_MEAN before including windows.h, for consistency
with other sources.
Differential Revision: https://reviews.llvm.org/D97539
Diffstat (limited to 'libcxx/src')
-rw-r--r-- | libcxx/src/support/win32/thread_win32.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/libcxx/src/support/win32/thread_win32.cpp b/libcxx/src/support/win32/thread_win32.cpp index 35c4c87..2b1aa56 100644 --- a/libcxx/src/support/win32/thread_win32.cpp +++ b/libcxx/src/support/win32/thread_win32.cpp @@ -8,6 +8,8 @@ //===----------------------------------------------------------------------===// #include <__threading_support> +#define NOMINMAX +#define WIN32_LEAN_AND_MEAN #include <windows.h> #include <process.h> #include <fibersapi.h> @@ -37,6 +39,9 @@ static_assert(alignof(__libcpp_thread_t) == alignof(HANDLE), ""); static_assert(sizeof(__libcpp_tls_key) == sizeof(DWORD), ""); static_assert(alignof(__libcpp_tls_key) == alignof(DWORD), ""); +static_assert(sizeof(__libcpp_semaphore_t) == sizeof(HANDLE), ""); +static_assert(alignof(__libcpp_semaphore_t) == alignof(HANDLE), ""); + // Mutex int __libcpp_recursive_mutex_init(__libcpp_recursive_mutex_t *__m) { @@ -272,4 +277,37 @@ int __libcpp_tls_set(__libcpp_tls_key __key, void *__p) return 0; } +// Semaphores +bool __libcpp_semaphore_init(__libcpp_semaphore_t* __sem, int __init) +{ + *(PHANDLE)__sem = CreateSemaphoreEx(nullptr, __init, _LIBCPP_SEMAPHORE_MAX, + nullptr, 0, SEMAPHORE_ALL_ACCESS); + return *__sem != nullptr; +} + +bool __libcpp_semaphore_destroy(__libcpp_semaphore_t* __sem) +{ + CloseHandle(*(PHANDLE)__sem); + return true; +} + +bool __libcpp_semaphore_post(__libcpp_semaphore_t* __sem) +{ + return ReleaseSemaphore(*(PHANDLE)__sem, 1, nullptr); +} + +bool __libcpp_semaphore_wait(__libcpp_semaphore_t* __sem) +{ + return WaitForSingleObjectEx(*(PHANDLE)__sem, INFINITE, false) == + WAIT_OBJECT_0; +} + +bool __libcpp_semaphore_wait_timed(__libcpp_semaphore_t* __sem, + chrono::nanoseconds const& __ns) +{ + chrono::milliseconds __ms = std::chrono::ceil<chrono::milliseconds>(__ns); + return WaitForSingleObjectEx(*(PHANDLE)__sem, __ms.count(), false) == + WAIT_OBJECT_0; +} + _LIBCPP_END_NAMESPACE_STD |