diff options
Diffstat (limited to 'src/platform/posix')
| -rw-r--r-- | src/platform/posix/posix_atomic.c | 57 | ||||
| -rw-r--r-- | src/platform/posix/posix_impl.h | 13 | ||||
| -rw-r--r-- | src/platform/posix/posix_thread.c | 1 |
3 files changed, 71 insertions, 0 deletions
diff --git a/src/platform/posix/posix_atomic.c b/src/platform/posix/posix_atomic.c new file mode 100644 index 00000000..a8d2579d --- /dev/null +++ b/src/platform/posix/posix_atomic.c @@ -0,0 +1,57 @@ +// +// Copyright 2018 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2018 Capitar IT Group BV <info@capitar.com> +// +// This software is supplied under the terms of the MIT License, a +// copy of which should be located in the distribution where this +// file was obtained (LICENSE.txt). A copy of the license may also be +// found online at https://opensource.org/licenses/MIT. +// + +// POSIX atomics. + +#include "core/nng_impl.h" + +#ifdef NNG_PLATFORM_POSIX + +#ifdef NNG_HAVE_STDATOMIC + +#include <stdatomic.h> +bool +nni_atomic_flag_test_and_set(nni_atomic_flag *f) +{ + return (atomic_flag_test_and_set(&f->f)); +} + +void +nni_atomic_flag_reset(nni_atomic_flag *f) +{ + atomic_flag_clear(&f->f); +} +#else + +#include <pthread.h> + +static pthread_mutex_t plat_atomic_lock = PTHREAD_MUTEX_INITIALIZER; + +bool +nni_atomic_flag_test_and_set(nni_atomic_flag *f) +{ + bool v; + pthread_mutex_lock(&plat_atomic_lock); + v = f->f; + f->f = true; + pthread_mutex_unlock(&plat_atomic_lock); + return (v); +} + +void +nni_atomic_flag_reset(nni_atomic_flag *f) +{ + pthread_mutex_lock(&plat_atomic_lock); + f->f = false; + pthread_mutex_unlock(&plat_atomic_lock); +} +#endif + +#endif // NNG_PLATFORM_POSIX diff --git a/src/platform/posix/posix_impl.h b/src/platform/posix/posix_impl.h index 33a9c293..70a3615f 100644 --- a/src/platform/posix/posix_impl.h +++ b/src/platform/posix/posix_impl.h @@ -75,6 +75,19 @@ struct nni_plat_flock { #define NNG_PLATFORM_DIR_SEP "/" +#ifdef NNG_HAVE_STDATOMIC + +#include <stdatomic.h> + +struct nni_atomic_flag { + atomic_flag f; +}; +#else // NNG_HAVE_C11_ATOMIC +struct nni_atomic_flag { + bool f; +}; +#endif + #endif extern int nni_posix_pollq_sysinit(void); diff --git a/src/platform/posix/posix_thread.c b/src/platform/posix/posix_thread.c index df2ee9d2..cc2ade6f 100644 --- a/src/platform/posix/posix_thread.c +++ b/src/platform/posix/posix_thread.c @@ -348,4 +348,5 @@ nni_plat_ncpu(void) return (1); #endif } + #endif // NNG_PLATFORM_POSIX |
