aboutsummaryrefslogtreecommitdiff
path: root/libcxx/src
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2021-02-26 00:41:35 +0200
committerMartin Storsjö <martin@martin.st>2021-03-05 10:48:59 +0200
commit1773eec6928f4e37b377e23b84d7a2a07d0d1d0d (patch)
tree51c47a3237b9c0e385d335d3f2d7f23f1668cbba /libcxx/src
parent579fd0259788e8dcd4c2a26b5eefdd0d78cd4093 (diff)
downloadllvm-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.cpp38
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