diff options
| author | Garrett D'Amore <garrett@damore.org> | 2024-11-09 23:45:21 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2024-11-11 11:03:12 -0800 |
| commit | 713b80f440cb414cd0b856bde0ea1b31f939777f (patch) | |
| tree | 1186c42418559c85719023bde3e919aa2df7fcef /src/platform/posix/posix_thread.c | |
| parent | cbe9a27ef7485977fbc7c713376b096b6723da3d (diff) | |
| download | nng-713b80f440cb414cd0b856bde0ea1b31f939777f.tar.gz nng-713b80f440cb414cd0b856bde0ea1b31f939777f.tar.bz2 nng-713b80f440cb414cd0b856bde0ea1b31f939777f.zip | |
refactor initialization/finalization
Applications must now call nng_init(), but they can supply
a set of parameters optionally. The code is now safe for
multiple libraries to do this concurrently, meaning nng_fini
no longer can race against another instance starting up.
The nni_init checks on all public APIs are removed now.
Diffstat (limited to 'src/platform/posix/posix_thread.c')
| -rw-r--r-- | src/platform/posix/posix_thread.c | 43 |
1 files changed, 11 insertions, 32 deletions
diff --git a/src/platform/posix/posix_thread.c b/src/platform/posix/posix_thread.c index b7cd5e1e..343a6ba5 100644 --- a/src/platform/posix/posix_thread.c +++ b/src/platform/posix/posix_thread.c @@ -1,5 +1,5 @@ // -// Copyright 2021 Staysail Systems, Inc. <info@staysail.tech> +// Copyright 2024 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 @@ -11,6 +11,7 @@ // POSIX threads. #include "core/nng_impl.h" +#include "nng/nng.h" #ifdef NNG_PLATFORM_POSIX @@ -33,9 +34,8 @@ #include <sys/resource.h> #endif -static pthread_mutex_t nni_plat_init_lock = PTHREAD_MUTEX_INITIALIZER; -static volatile int nni_plat_inited = 0; -static int nni_plat_forked = 0; +static bool nni_plat_inited = 0; +static bool nni_plat_forked = 0; pthread_condattr_t nni_cvattr; pthread_mutexattr_t nni_mxattr; @@ -143,6 +143,9 @@ nni_pthread_cond_timedwait( void nni_plat_mtx_lock(nni_plat_mtx *mtx) { + if (nni_plat_forked) { + nni_panic("nng is not fork-reentrant safe"); + } nni_pthread_mutex_lock(&mtx->mtx); } @@ -339,35 +342,20 @@ nni_atfork_child(void) } int -nni_plat_init(int (*helper)(void)) +nni_plat_init(nng_init_params *params) { int rv; - if (nni_plat_forked) { - nni_panic("nng is not fork-reentrant safe"); - } - if (nni_plat_inited) { - return (0); // fast path - } - - pthread_mutex_lock(&nni_plat_init_lock); - if (nni_plat_inited) { // check again under the lock to be sure - pthread_mutex_unlock(&nni_plat_init_lock); - return (0); - } - if ((pthread_mutexattr_init(&nni_mxattr) != 0) || (pthread_condattr_init(&nni_cvattr) != 0) || (pthread_attr_init(&nni_thrattr) != 0)) { // Technically this is leaking, but it should never // occur, so really not worried about it. - pthread_mutex_unlock(&nni_plat_init_lock); return (NNG_ENOMEM); } #if !defined(NNG_USE_GETTIMEOFDAY) && NNG_USE_CLOCKID != CLOCK_REALTIME if (pthread_condattr_setclock(&nni_cvattr, NNG_USE_CLOCKID) != 0) { - pthread_mutex_unlock(&nni_plat_init_lock); pthread_mutexattr_destroy(&nni_mxattr); pthread_condattr_destroy(&nni_cvattr); pthread_attr_destroy(&nni_thrattr); @@ -381,7 +369,6 @@ nni_plat_init(int (*helper)(void)) (rl.rlim_cur != RLIM_INFINITY) && (rl.rlim_cur >= PTHREAD_STACK_MIN) && (pthread_attr_setstacksize(&nni_thrattr, rl.rlim_cur) != 0)) { - pthread_mutex_unlock(&nni_plat_init_lock); pthread_mutexattr_destroy(&nni_mxattr); pthread_condattr_destroy(&nni_cvattr); pthread_attr_destroy(&nni_thrattr); @@ -393,16 +380,14 @@ nni_plat_init(int (*helper)(void)) (void) pthread_mutexattr_settype( &nni_mxattr, PTHREAD_MUTEX_ERRORCHECK); - if ((rv = nni_posix_pollq_sysinit()) != 0) { - pthread_mutex_unlock(&nni_plat_init_lock); + if ((rv = nni_posix_pollq_sysinit(params)) != 0) { pthread_mutexattr_destroy(&nni_mxattr); pthread_condattr_destroy(&nni_cvattr); pthread_attr_destroy(&nni_thrattr); return (rv); } - if ((rv = nni_posix_resolv_sysinit()) != 0) { - pthread_mutex_unlock(&nni_plat_init_lock); + if ((rv = nni_posix_resolv_sysinit(params)) != 0) { nni_posix_pollq_sysfini(); pthread_mutexattr_destroy(&nni_mxattr); pthread_condattr_destroy(&nni_cvattr); @@ -411,7 +396,6 @@ nni_plat_init(int (*helper)(void)) } if (pthread_atfork(NULL, NULL, nni_atfork_child) != 0) { - pthread_mutex_unlock(&nni_plat_init_lock); nni_posix_resolv_sysfini(); nni_posix_pollq_sysfini(); pthread_mutexattr_destroy(&nni_mxattr); @@ -419,10 +403,7 @@ nni_plat_init(int (*helper)(void)) pthread_attr_destroy(&nni_thrattr); return (NNG_ENOMEM); } - if ((rv = helper()) == 0) { - nni_plat_inited = 1; - } - pthread_mutex_unlock(&nni_plat_init_lock); + nni_plat_inited = 1; return (rv); } @@ -430,7 +411,6 @@ nni_plat_init(int (*helper)(void)) void nni_plat_fini(void) { - pthread_mutex_lock(&nni_plat_init_lock); if (nni_plat_inited) { nni_posix_resolv_sysfini(); nni_posix_pollq_sysfini(); @@ -438,7 +418,6 @@ nni_plat_fini(void) pthread_condattr_destroy(&nni_cvattr); nni_plat_inited = 0; } - pthread_mutex_unlock(&nni_plat_init_lock); } int |
