wolfcrypt/src/wc_port.c and wolfssl/wolfcrypt/wc_port.h: change precedence of atomic implementations, and don't use the stdatomic.h in C++ builds (not compatible);
fix the name of the wolfSSL_Atomic_Ptr_CompareExchange() implementation in the _MSC_VER code path.
This commit is contained in:
@@ -1271,11 +1271,105 @@ char* wc_strdup_ex(const char *src, int memType) {
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(WOLFSSL_ATOMIC_OPS) && !defined(SINGLE_THREADED)
|
||||
#ifdef WOLFSSL_ATOMIC_OPS
|
||||
|
||||
#if defined(WOLFSSL_USER_DEFINED_ATOMICS)
|
||||
|
||||
#elif defined(HAVE_C___ATOMIC) && defined(WOLFSSL_HAVE_ATOMIC_H)
|
||||
#elif defined(SINGLE_THREADED)
|
||||
|
||||
#elif defined(__GNUC__) && defined(__ATOMIC_RELAXED)
|
||||
/* direct calls using gcc-style compiler built-ins */
|
||||
|
||||
void wolfSSL_Atomic_Int_Init(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
*c = i;
|
||||
}
|
||||
|
||||
void wolfSSL_Atomic_Uint_Init(wolfSSL_Atomic_Uint* c, unsigned int i)
|
||||
{
|
||||
*c = i;
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_FetchAdd(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
return __atomic_fetch_add(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_FetchSub(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
return __atomic_fetch_sub(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_AddFetch(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
return __atomic_add_fetch(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_SubFetch(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
return __atomic_sub_fetch(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_CompareExchange(wolfSSL_Atomic_Int* c, int *expected_i,
|
||||
int new_i)
|
||||
{
|
||||
/* For the success path, use full synchronization with barriers --
|
||||
* "Sequentially-consistent ordering" -- so that all threads see the same
|
||||
* "single total modification order of all atomic operations" -- but on
|
||||
* failure we just need to be sure we acquire the value that changed out
|
||||
* from under us.
|
||||
*/
|
||||
return __atomic_compare_exchange_n(c, expected_i, new_i, 0 /* weak */,
|
||||
__ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
|
||||
}
|
||||
|
||||
unsigned int wolfSSL_Atomic_Uint_FetchAdd(wolfSSL_Atomic_Uint* c,
|
||||
unsigned int i)
|
||||
{
|
||||
return __atomic_fetch_add(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
unsigned int wolfSSL_Atomic_Uint_FetchSub(wolfSSL_Atomic_Uint* c,
|
||||
unsigned int i)
|
||||
{
|
||||
return __atomic_fetch_sub(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
unsigned int wolfSSL_Atomic_Uint_AddFetch(wolfSSL_Atomic_Uint* c,
|
||||
unsigned int i)
|
||||
{
|
||||
return __atomic_add_fetch(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
unsigned int wolfSSL_Atomic_Uint_SubFetch(wolfSSL_Atomic_Uint* c,
|
||||
unsigned int i)
|
||||
{
|
||||
return __atomic_sub_fetch(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Uint_CompareExchange(
|
||||
wolfSSL_Atomic_Uint* c, unsigned int *expected_i, unsigned int new_i)
|
||||
{
|
||||
/* For the success path, use full synchronization with barriers --
|
||||
* "Sequentially-consistent ordering" -- so that all threads see the same
|
||||
* "single total modification order of all atomic operations" -- but on
|
||||
* failure we just need to be sure we acquire the value that changed out
|
||||
* from under us.
|
||||
*/
|
||||
return __atomic_compare_exchange_n(
|
||||
c, expected_i, new_i, 0 /* weak */, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Ptr_CompareExchange(
|
||||
void **c, void **expected_ptr, void *new_ptr)
|
||||
{
|
||||
return __atomic_compare_exchange_n(
|
||||
c, expected_ptr, new_ptr, 0 /* weak */,
|
||||
__ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
|
||||
}
|
||||
|
||||
#elif defined(HAVE_C___ATOMIC) && defined(WOLFSSL_HAVE_ATOMIC_H) && \
|
||||
!defined(__cplusplus)
|
||||
|
||||
/* Default C Implementation */
|
||||
void wolfSSL_Atomic_Int_Init(wolfSSL_Atomic_Int* c, int i)
|
||||
@@ -1374,97 +1468,6 @@ int wolfSSL_Atomic_Ptr_CompareExchange(
|
||||
__ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
|
||||
}
|
||||
|
||||
#elif defined(__GNUC__) && defined(__ATOMIC_RELAXED)
|
||||
/* direct calls using gcc-style compiler built-ins */
|
||||
|
||||
void wolfSSL_Atomic_Int_Init(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
*c = i;
|
||||
}
|
||||
|
||||
void wolfSSL_Atomic_Uint_Init(wolfSSL_Atomic_Uint* c, unsigned int i)
|
||||
{
|
||||
*c = i;
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_FetchAdd(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
return __atomic_fetch_add(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_FetchSub(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
return __atomic_fetch_sub(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_AddFetch(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
return __atomic_add_fetch(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_SubFetch(wolfSSL_Atomic_Int* c, int i)
|
||||
{
|
||||
return __atomic_sub_fetch(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Int_CompareExchange(wolfSSL_Atomic_Int* c, int *expected_i,
|
||||
int new_i)
|
||||
{
|
||||
/* For the success path, use full synchronization with barriers --
|
||||
* "Sequentially-consistent ordering" -- so that all threads see the same
|
||||
* "single total modification order of all atomic operations" -- but on
|
||||
* failure we just need to be sure we acquire the value that changed out
|
||||
* from under us.
|
||||
*/
|
||||
return __atomic_compare_exchange_n(c, expected_i, new_i, 0 /* weak */,
|
||||
__ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
|
||||
}
|
||||
|
||||
unsigned int wolfSSL_Atomic_Uint_FetchAdd(wolfSSL_Atomic_Uint* c,
|
||||
unsigned int i)
|
||||
{
|
||||
return __atomic_fetch_add(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
unsigned int wolfSSL_Atomic_Uint_FetchSub(wolfSSL_Atomic_Uint* c,
|
||||
unsigned int i)
|
||||
{
|
||||
return __atomic_fetch_sub(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
unsigned int wolfSSL_Atomic_Uint_AddFetch(wolfSSL_Atomic_Uint* c,
|
||||
unsigned int i)
|
||||
{
|
||||
return __atomic_add_fetch(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
unsigned int wolfSSL_Atomic_Uint_SubFetch(wolfSSL_Atomic_Uint* c,
|
||||
unsigned int i)
|
||||
{
|
||||
return __atomic_sub_fetch(c, i, __ATOMIC_RELAXED);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Uint_CompareExchange(
|
||||
wolfSSL_Atomic_Uint* c, unsigned int *expected_i, unsigned int new_i)
|
||||
{
|
||||
/* For the success path, use full synchronization with barriers --
|
||||
* "Sequentially-consistent ordering" -- so that all threads see the same
|
||||
* "single total modification order of all atomic operations" -- but on
|
||||
* failure we just need to be sure we acquire the value that changed out
|
||||
* from under us.
|
||||
*/
|
||||
return __atomic_compare_exchange_n(
|
||||
c, expected_i, new_i, 0 /* weak */, __ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Ptr_CompareExchange(
|
||||
void **c, void **expected_ptr, void *new_ptr)
|
||||
{
|
||||
return __atomic_compare_exchange_n(
|
||||
c, expected_ptr, new_ptr, 0 /* weak */,
|
||||
__ATOMIC_SEQ_CST, __ATOMIC_ACQUIRE);
|
||||
}
|
||||
|
||||
#elif defined(_MSC_VER) && !defined(WOLFSSL_NOT_WINDOWS_API)
|
||||
|
||||
void wolfSSL_Atomic_Int_Init(wolfSSL_Atomic_Int* c, int i)
|
||||
@@ -1557,7 +1560,7 @@ int wolfSSL_Atomic_Uint_CompareExchange(
|
||||
}
|
||||
}
|
||||
|
||||
int wolfSSL_Atomic_Uint_CompareExchange(
|
||||
int wolfSSL_Atomic_Ptr_CompareExchange(
|
||||
void ** c, void **expected_ptr, void *new_ptr)
|
||||
{
|
||||
#ifdef _WIN64
|
||||
|
||||
@@ -494,15 +494,6 @@
|
||||
#define WOLFSSL_ATOMIC_LOAD(x) (x)
|
||||
#define WOLFSSL_ATOMIC_STORE(x, val) (x) = (val)
|
||||
#define WOLFSSL_ATOMIC_OPS
|
||||
#elif defined(HAVE_C___ATOMIC) && defined(WOLFSSL_HAVE_ATOMIC_H)
|
||||
/* Default C Implementation */
|
||||
#include <stdatomic.h>
|
||||
typedef atomic_int wolfSSL_Atomic_Int;
|
||||
typedef atomic_uint wolfSSL_Atomic_Uint;
|
||||
#define WOLFSSL_ATOMIC_INITIALIZER(x) (x)
|
||||
#define WOLFSSL_ATOMIC_LOAD(x) atomic_load(&(x))
|
||||
#define WOLFSSL_ATOMIC_STORE(x, val) atomic_store(&(x), val)
|
||||
#define WOLFSSL_ATOMIC_OPS
|
||||
#elif defined(__GNUC__) && defined(__ATOMIC_CONSUME)
|
||||
/* direct calls using gcc-style compiler built-ins */
|
||||
typedef volatile int wolfSSL_Atomic_Int;
|
||||
@@ -513,6 +504,16 @@
|
||||
#define WOLFSSL_ATOMIC_STORE(x, val) __atomic_store_n(&(x), \
|
||||
val, __ATOMIC_RELEASE)
|
||||
#define WOLFSSL_ATOMIC_OPS
|
||||
#elif defined(HAVE_C___ATOMIC) && defined(WOLFSSL_HAVE_ATOMIC_H) && \
|
||||
!defined(__cplusplus)
|
||||
/* Default C Implementation */
|
||||
#include <stdatomic.h>
|
||||
typedef atomic_int wolfSSL_Atomic_Int;
|
||||
typedef atomic_uint wolfSSL_Atomic_Uint;
|
||||
#define WOLFSSL_ATOMIC_INITIALIZER(x) (x)
|
||||
#define WOLFSSL_ATOMIC_LOAD(x) atomic_load(&(x))
|
||||
#define WOLFSSL_ATOMIC_STORE(x, val) atomic_store(&(x), val)
|
||||
#define WOLFSSL_ATOMIC_OPS
|
||||
#elif defined(_MSC_VER) && !defined(WOLFSSL_NOT_WINDOWS_API)
|
||||
/* Use MSVC compiler intrinsics for atomic ops */
|
||||
#ifdef _WIN32_WCE
|
||||
|
||||
Reference in New Issue
Block a user