aboutsummaryrefslogtreecommitdiff
path: root/src/crypto/c_threads.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/crypto/c_threads.h')
-rw-r--r--src/crypto/c_threads.h40
1 files changed, 25 insertions, 15 deletions
diff --git a/src/crypto/c_threads.h b/src/crypto/c_threads.h
index c5431cb8d..b4f773641 100644
--- a/src/crypto/c_threads.h
+++ b/src/crypto/c_threads.h
@@ -30,29 +30,39 @@
#pragma once
#ifdef _WIN32
+
#include <windows.h>
-#define CTHR_MUTEX_TYPE HANDLE
-#define CTHR_MUTEX_INIT NULL
-#define CTHR_MUTEX_LOCK(x) do { if (x == NULL) { \
- HANDLE p = CreateMutex(NULL, FALSE, NULL); \
- if (InterlockedCompareExchangePointer((PVOID*)&x, (PVOID)p, NULL) != NULL) \
- CloseHandle(p); \
- } WaitForSingleObject(x, INFINITE); } while(0)
-#define CTHR_MUTEX_UNLOCK(x) ReleaseMutex(x)
+
+#define CTHR_RWLOCK_TYPE SRWLOCK
+#define CTHR_RWLOCK_INIT SRWLOCK_INIT
+#define CTHR_RWLOCK_LOCK_WRITE(x) AcquireSRWLockExclusive(&x)
+#define CTHR_RWLOCK_UNLOCK_WRITE(x) ReleaseSRWLockExclusive(&x)
+#define CTHR_RWLOCK_LOCK_READ(x) AcquireSRWLockShared(&x)
+#define CTHR_RWLOCK_UNLOCK_READ(x) ReleaseSRWLockShared(&x)
+#define CTHR_RWLOCK_TRYLOCK_READ(x) TryAcquireSRWLockShared(&x)
+
#define CTHR_THREAD_TYPE HANDLE
#define CTHR_THREAD_RTYPE void
#define CTHR_THREAD_RETURN return
-#define CTHR_THREAD_CREATE(thr, func, arg) thr = (HANDLE)_beginthread(func, 0, arg)
-#define CTHR_THREAD_JOIN(thr) WaitForSingleObject(thr, INFINITE)
+#define CTHR_THREAD_CREATE(thr, func, arg) ((thr = (HANDLE)_beginthread(func, 0, arg)) != -1L)
+#define CTHR_THREAD_JOIN(thr) WaitForSingleObject((HANDLE)thr, INFINITE)
+
#else
+
#include <pthread.h>
-#define CTHR_MUTEX_TYPE pthread_mutex_t
-#define CTHR_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
-#define CTHR_MUTEX_LOCK(x) pthread_mutex_lock(&x)
-#define CTHR_MUTEX_UNLOCK(x) pthread_mutex_unlock(&x)
+
+#define CTHR_RWLOCK_TYPE pthread_rwlock_t
+#define CTHR_RWLOCK_INIT PTHREAD_RWLOCK_INITIALIZER
+#define CTHR_RWLOCK_LOCK_WRITE(x) pthread_rwlock_wrlock(&x)
+#define CTHR_RWLOCK_UNLOCK_WRITE(x) pthread_rwlock_unlock(&x)
+#define CTHR_RWLOCK_LOCK_READ(x) pthread_rwlock_rdlock(&x)
+#define CTHR_RWLOCK_UNLOCK_READ(x) pthread_rwlock_unlock(&x)
+#define CTHR_RWLOCK_TRYLOCK_READ(x) (pthread_rwlock_tryrdlock(&x) == 0)
+
#define CTHR_THREAD_TYPE pthread_t
#define CTHR_THREAD_RTYPE void *
#define CTHR_THREAD_RETURN return NULL
-#define CTHR_THREAD_CREATE(thr, func, arg) pthread_create(&thr, NULL, func, arg)
+#define CTHR_THREAD_CREATE(thr, func, arg) (pthread_create(&thr, NULL, func, arg) == 0)
#define CTHR_THREAD_JOIN(thr) pthread_join(thr, NULL)
+
#endif