From 0e138b6a3d3fb41c5915ddf1b327fc6f28e074a6 Mon Sep 17 00:00:00 2001 From: "C. McEnroe" Date: Thu, 22 Oct 2020 03:03:56 -0400 Subject: Import LibreSSL 3.2.2 --- include/Makefile.am | 3 +++ include/compat/pthread.h | 31 +++++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 4 deletions(-) mode change 100644 => 100755 include/compat/pthread.h (limited to 'include') diff --git a/include/Makefile.am b/include/Makefile.am index 6d808cc..4184cf8 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -32,12 +32,15 @@ noinst_HEADERS += compat/netinet/in.h noinst_HEADERS += compat/netinet/ip.h noinst_HEADERS += compat/netinet/tcp.h +noinst_HEADERS += compat/sys/_null.h noinst_HEADERS += compat/sys/ioctl.h noinst_HEADERS += compat/sys/mman.h noinst_HEADERS += compat/sys/param.h +noinst_HEADERS += compat/sys/queue.h noinst_HEADERS += compat/sys/select.h noinst_HEADERS += compat/sys/socket.h noinst_HEADERS += compat/sys/stat.h +noinst_HEADERS += compat/sys/tree.h noinst_HEADERS += compat/sys/time.h noinst_HEADERS += compat/sys/types.h noinst_HEADERS += compat/sys/uio.h diff --git a/include/compat/pthread.h b/include/compat/pthread.h old mode 100644 new mode 100755 index 8b8c3c6..1527d3c --- a/include/compat/pthread.h +++ b/include/compat/pthread.h @@ -8,6 +8,8 @@ #ifdef _WIN32 +#include +#include #include /* @@ -15,6 +17,11 @@ */ #define PTHREAD_ONCE_INIT { INIT_ONCE_STATIC_INIT } +/* + * Static mutex initialization values. + */ +#define PTHREAD_MUTEX_INITIALIZER { .lock = NULL } + /* * Once definitions. */ @@ -55,27 +62,43 @@ pthread_equal(pthread_t t1, pthread_t t2) return t1 == t2; } -typedef CRITICAL_SECTION pthread_mutex_t; +struct pthread_mutex { + volatile LPCRITICAL_SECTION lock; +}; +typedef struct pthread_mutex pthread_mutex_t; typedef void pthread_mutexattr_t; static inline int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr) { - InitializeCriticalSection(mutex); + if ((mutex->lock = malloc(sizeof(CRITICAL_SECTION))) == NULL) + exit(ENOMEM); + InitializeCriticalSection(mutex->lock); return 0; } static inline int pthread_mutex_lock(pthread_mutex_t *mutex) { - EnterCriticalSection(mutex); + if (mutex->lock == NULL) { + LPCRITICAL_SECTION lcs; + + if ((lcs = malloc(sizeof(CRITICAL_SECTION))) == NULL) + exit(ENOMEM); + InitializeCriticalSection(lcs); + if (InterlockedCompareExchangePointer((PVOID*)&mutex->lock, (PVOID)lcs, NULL) != NULL) { + DeleteCriticalSection(lcs); + free(lcs); + } + } + EnterCriticalSection(mutex->lock); return 0; } static inline int pthread_mutex_unlock(pthread_mutex_t *mutex) { - LeaveCriticalSection(mutex); + LeaveCriticalSection(mutex->lock); return 0; } -- cgit 1.4.1