Small improvement in initialize_once() and fixed a Clang warning.
This commit is contained in:
parent
4383c5f858
commit
c4b869981f
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
/* Intel(R) oneAPI DPC++/C++ Compiler */
|
/* Intel(R) oneAPI DPC++/C++ Compiler */
|
||||||
#if defined(__INTEL_LLVM_COMPILER) && (!defined(__GNUC__))
|
#if defined(__INTEL_LLVM_COMPILER) && (!defined(__GNUC__))
|
||||||
# define __GNUC__ 10
|
# define __GNUC__ 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Compiler compatibility */
|
/* Compiler compatibility */
|
||||||
|
@ -31,6 +31,7 @@ static INLINE size_t MIN_SIZE(const size_t a, const size_t b) { return (a > b) ?
|
|||||||
# include <io.h>
|
# include <io.h>
|
||||||
#else
|
#else
|
||||||
# include <unistd.h>
|
# include <unistd.h>
|
||||||
|
# include <sched.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* detect compiler destructor support */
|
/* detect compiler destructor support */
|
||||||
@ -60,21 +61,28 @@ static INLINE size_t MIN_SIZE(const size_t a, const size_t b) { return (a > b) ?
|
|||||||
# pragma message("Function explicit_bzero() is *not* available -> using fallback!")
|
# pragma message("Function explicit_bzero() is *not* available -> using fallback!")
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* detect sched_yield() or Sleep() support */
|
||||||
|
#ifdef _WIN32
|
||||||
|
# define SCHED_YIELD() Sleep(0)
|
||||||
|
#else
|
||||||
|
# define SCHED_YIELD() sched_yield()
|
||||||
|
#endif
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
// One-time initialization
|
// One-time initialization
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
/* atomic memory access */
|
/* atomic memory access */
|
||||||
#if defined(_WIN32)
|
#if defined(_MSC_VER) && (!defined(__GNUC__))
|
||||||
# define ATOMIC_EXCHANGE(X,Y) InterlockedExchange((X),(Y))
|
|
||||||
# define ATOMIC_COMPARE_EXCHANGE(X,Y,Z) InterlockedCompareExchange((X),(Y),(Z))
|
# define ATOMIC_COMPARE_EXCHANGE(X,Y,Z) InterlockedCompareExchange((X),(Y),(Z))
|
||||||
|
# define ATOMIC_EXCHANGE(X,Y) InterlockedExchange((X),(Y))
|
||||||
#else
|
#else
|
||||||
# define ATOMIC_EXCHANGE(X,Y) __sync_lock_test_and_set((X),(Y))
|
|
||||||
# define ATOMIC_COMPARE_EXCHANGE(X,Y,Z) __sync_val_compare_and_swap((X),(Z),(Y))
|
# define ATOMIC_COMPARE_EXCHANGE(X,Y,Z) __sync_val_compare_and_swap((X),(Z),(Y))
|
||||||
|
# define ATOMIC_EXCHANGE(X,Y) __sync_lock_test_and_set((X),(Y))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* execute initialization function once */
|
/* execute initialization function once */
|
||||||
static void initialize_once(volatile long *const once_flag, void (*const init_routine)(void))
|
static INLINE void initialize_once(volatile long *const once_flag, void (*const init_routine)(void))
|
||||||
{
|
{
|
||||||
long state;
|
long state;
|
||||||
while ((state = ATOMIC_COMPARE_EXCHANGE(once_flag, -1, 0)) != 0)
|
while ((state = ATOMIC_COMPARE_EXCHANGE(once_flag, -1, 0)) != 0)
|
||||||
@ -83,6 +91,7 @@ static void initialize_once(volatile long *const once_flag, void (*const init_ro
|
|||||||
{
|
{
|
||||||
return; /*already initialized*/
|
return; /*already initialized*/
|
||||||
}
|
}
|
||||||
|
SCHED_YIELD();
|
||||||
}
|
}
|
||||||
init_routine();
|
init_routine();
|
||||||
ATOMIC_EXCHANGE(once_flag, 1);
|
ATOMIC_EXCHANGE(once_flag, 1);
|
||||||
@ -235,7 +244,7 @@ void slunkcrypt_bzero(void* const buffer, const size_t length)
|
|||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
|
|
||||||
#if defined(HAVE_ATTRIB_DESTRUCTOR)
|
#if defined(HAVE_ATTRIB_DESTRUCTOR)
|
||||||
__attribute__((destructor)) void slunkcrypt_destructor()
|
__attribute__((destructor)) void slunkcrypt_destructor(void)
|
||||||
{
|
{
|
||||||
exit_random_source();
|
exit_random_source();
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,13 @@
|
|||||||
/* This work has been released under the CC0 1.0 Universal license! */
|
/* This work has been released under the CC0 1.0 Universal license! */
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
#ifndef SLUNKBUILD_NOTHREADS
|
#ifdef SLUNKBUILD_NOTHREADS
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# pragma GCC diagnostic ignored "-Wpedantic"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /*SLUNKBUILD_NOTHREADS*/
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
# define _CRT_SECURE_NO_WARNINGS 1
|
# define _CRT_SECURE_NO_WARNINGS 1
|
||||||
|
Loading…
Reference in New Issue
Block a user