aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix/posix_thread.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-11-09 23:45:21 -0800
committerGarrett D'Amore <garrett@damore.org>2024-11-11 11:03:12 -0800
commit713b80f440cb414cd0b856bde0ea1b31f939777f (patch)
tree1186c42418559c85719023bde3e919aa2df7fcef /src/platform/posix/posix_thread.c
parentcbe9a27ef7485977fbc7c713376b096b6723da3d (diff)
downloadnng-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.c43
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