From d1a9c84a6b375cb25a8b7475957130e364b41753 Mon Sep 17 00:00:00 2001 From: Garrett D'Amore Date: Mon, 2 Jul 2018 22:36:08 -0700 Subject: fixes #572 Several locking errors found fixes #573 atomic flags could help This introduces a new atomic flag, and reduces some of the global locking. The lock refactoring work is not yet complete, but this is a positive step forward, and should help with certain things. While here we also fixed a compile warning due to incorrect types. --- src/platform/posix/posix_atomic.c | 57 +++++++++++++++++++++++++++++++++++++++ src/platform/posix/posix_impl.h | 13 +++++++++ src/platform/posix/posix_thread.c | 1 + 3 files changed, 71 insertions(+) create mode 100644 src/platform/posix/posix_atomic.c (limited to 'src/platform/posix') 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. +// Copyright 2018 Capitar IT Group BV +// +// 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 +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 + +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 + +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 -- cgit v1.2.3-70-g09d2