aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2025-01-05 09:46:16 -0800
committerGarrett D'Amore <garrett@damore.org>2025-01-05 09:49:56 -0800
commite5d5b625f16c3c3df5a3fdcc114a6694d82ab6e8 (patch)
tree8cf3f1ede137ac8c08c002700a297fe0d6972fd3
parentcf7dda752e1a49cb1003b0e300a5200ff0b0c92e (diff)
downloadnng-e5d5b625f16c3c3df5a3fdcc114a6694d82ab6e8.tar.gz
nng-e5d5b625f16c3c3df5a3fdcc114a6694d82ab6e8.tar.bz2
nng-e5d5b625f16c3c3df5a3fdcc114a6694d82ab6e8.zip
platform: remove reader/writer locks
The only thing using this was the transport lookups, but as those transports are now fully initialized in nng_init, we no longer need to lock that at all.
-rw-r--r--src/core/platform.h17
-rw-r--r--src/platform/posix/posix_impl.h9
-rw-r--r--src/platform/posix/posix_thread.c47
-rw-r--r--src/platform/windows/win_impl.h10
-rw-r--r--src/platform/windows/win_thread.c38
-rw-r--r--src/sp/transport.c8
6 files changed, 5 insertions, 124 deletions
diff --git a/src/core/platform.h b/src/core/platform.h
index 4ca6a2f4..ca39ac98 100644
--- a/src/core/platform.h
+++ b/src/core/platform.h
@@ -85,11 +85,9 @@ extern void *nni_zalloc(size_t);
// Most implementations can just call free() here.
extern void nni_free(void *, size_t);
-typedef struct nni_plat_mtx nni_plat_mtx;
-typedef struct nni_plat_rwlock nni_plat_rwlock;
-typedef struct nni_plat_cv nni_plat_cv;
-typedef struct nni_plat_thr nni_plat_thr;
-typedef struct nni_rwlock nni_rwlock;
+typedef struct nni_plat_mtx nni_plat_mtx;
+typedef struct nni_plat_cv nni_plat_cv;
+typedef struct nni_plat_thr nni_plat_thr;
//
// Threading & Synchronization Support
@@ -111,15 +109,6 @@ extern void nni_plat_mtx_lock(nni_plat_mtx *);
// thread that owned the mutex.
extern void nni_plat_mtx_unlock(nni_plat_mtx *);
-// read/write locks - these work like mutexes except that multiple readers
-// can acquire the lock. These are not safe for recursive use, and it is
-// unspecified whether any measures are provided to prevent starvation.
-extern void nni_rwlock_init(nni_rwlock *);
-extern void nni_rwlock_fini(nni_rwlock *);
-extern void nni_rwlock_rdlock(nni_rwlock *);
-extern void nni_rwlock_wrlock(nni_rwlock *);
-extern void nni_rwlock_unlock(nni_rwlock *);
-
// nni_plat_cv_init initializes a condition variable. We require a mutex be
// supplied with it, and that mutex must always be held when performing any
// operations on the condition variable (other than fini.) As with mutexes, an
diff --git a/src/platform/posix/posix_impl.h b/src/platform/posix/posix_impl.h
index b6435353..2229f17c 100644
--- a/src/platform/posix/posix_impl.h
+++ b/src/platform/posix/posix_impl.h
@@ -65,15 +65,6 @@ struct nni_plat_mtx {
PTHREAD_MUTEX_INITIALIZER \
}
-struct nni_rwlock {
- pthread_rwlock_t rwl;
-};
-
-#define NNI_RWLOCK_INITIALIZER \
- { \
- PTHREAD_RWLOCK_INITIALIZER \
- }
-
// No static form of CV initialization because of the need to use
// attributes to set the clock type.
struct nni_plat_cv {
diff --git a/src/platform/posix/posix_thread.c b/src/platform/posix/posix_thread.c
index e8c9036c..ac6371c9 100644
--- a/src/platform/posix/posix_thread.c
+++ b/src/platform/posix/posix_thread.c
@@ -156,53 +156,6 @@ nni_plat_mtx_unlock(nni_plat_mtx *mtx)
}
void
-nni_rwlock_init(nni_rwlock *rwl)
-{
- while (pthread_rwlock_init(&rwl->rwl, NULL) != 0) {
- // We must have memory exhaustion -- ENOMEM, or
- // in some cases EAGAIN. Wait a bit before we try to
- // give things a chance to settle down.
- nni_msleep(10);
- }
-}
-
-void
-nni_rwlock_fini(nni_rwlock *rwl)
-{
- int rv;
- if ((rv = pthread_rwlock_destroy(&rwl->rwl)) != 0) {
- nni_panic("pthread_rwlock_destroy: %s", strerror(rv));
- }
-}
-
-void
-nni_rwlock_rdlock(nni_rwlock *rwl)
-{
- int rv;
- if ((rv = pthread_rwlock_rdlock(&rwl->rwl)) != 0) {
- nni_panic("pthread_rwlock_rdlock: %s", strerror(rv));
- }
-}
-
-void
-nni_rwlock_wrlock(nni_rwlock *rwl)
-{
- int rv;
- if ((rv = pthread_rwlock_wrlock(&rwl->rwl)) != 0) {
- nni_panic("pthread_rwlock_wrlock: %s", strerror(rv));
- }
-}
-
-void
-nni_rwlock_unlock(nni_rwlock *rwl)
-{
- int rv;
- if ((rv = pthread_rwlock_unlock(&rwl->rwl)) != 0) {
- nni_panic("pthread_rwlock_unlock: %s", strerror(rv));
- }
-}
-
-void
nni_plat_cv_init(nni_plat_cv *cv, nni_plat_mtx *mtx)
{
// See the comments in nni_plat_mtx_init. Almost everywhere this
diff --git a/src/platform/windows/win_impl.h b/src/platform/windows/win_impl.h
index 1659b099..db190d42 100644
--- a/src/platform/windows/win_impl.h
+++ b/src/platform/windows/win_impl.h
@@ -44,16 +44,6 @@ struct nni_plat_mtx {
SRWLOCK_INIT \
}
-struct nni_rwlock {
- SRWLOCK rwl;
- BOOLEAN exclusive;
-};
-
-#define NNI_RWLOCK_INITIALIZER \
- { \
- SRWLOCK_INIT \
- }
-
struct nni_plat_cv {
CONDITION_VARIABLE cv;
PSRWLOCK srl;
diff --git a/src/platform/windows/win_thread.c b/src/platform/windows/win_thread.c
index c76209c1..7d865604 100644
--- a/src/platform/windows/win_thread.c
+++ b/src/platform/windows/win_thread.c
@@ -1,5 +1,5 @@
//
-// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2025 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
@@ -79,42 +79,6 @@ nni_plat_mtx_unlock(nni_plat_mtx *mtx)
}
void
-nni_rwlock_init(nni_rwlock *rwl)
-{
- InitializeSRWLock(&rwl->rwl);
-}
-
-void
-nni_rwlock_fini(nni_rwlock *rwl)
-{
- rwl->exclusive = FALSE;
-}
-
-void
-nni_rwlock_rdlock(nni_rwlock *rwl)
-{
- AcquireSRWLockShared(&rwl->rwl);
-}
-
-void
-nni_rwlock_wrlock(nni_rwlock *rwl)
-{
- AcquireSRWLockExclusive(&rwl->rwl);
- rwl->exclusive = TRUE;
-}
-
-void
-nni_rwlock_unlock(nni_rwlock *rwl)
-{
- if (rwl->exclusive) {
- rwl->exclusive = FALSE;
- ReleaseSRWLockExclusive(&rwl->rwl);
- } else {
- ReleaseSRWLockShared(&rwl->rwl);
- }
-}
-
-void
nni_plat_cv_init(nni_plat_cv *cv, nni_plat_mtx *mtx)
{
InitializeConditionVariable(&cv->cv);
diff --git a/src/sp/transport.c b/src/sp/transport.c
index 1082db5b..e1c2737e 100644
--- a/src/sp/transport.c
+++ b/src/sp/transport.c
@@ -1,5 +1,5 @@
//
-// Copyright 2024 Staysail Systems, Inc. <info@staysail.tech>
+// Copyright 2025 Staysail Systems, Inc. <info@staysail.tech>
// Copyright 2018 Capitar IT Group BV <info@capitar.com>
// Copyright 2019 Devolutions <info@devolutions.net>
//
@@ -16,7 +16,6 @@
static nni_list sp_tran_list =
NNI_LIST_INITIALIZER(sp_tran_list, nni_sp_tran, tran_link);
-static nni_rwlock sp_tran_lk = NNI_RWLOCK_INITIALIZER;
void
nni_sp_tran_register(nni_sp_tran *tran)
@@ -55,14 +54,12 @@ nni_sp_tran_register(nni_sp_tran *tran)
}
#endif
- nni_rwlock_wrlock(&sp_tran_lk);
if (!nni_list_node_active(&tran->tran_link)) {
tran->tran_init();
nni_list_append(&sp_tran_list, tran);
nng_log_info(
"NNG-TRAN", "Registered transport: %s", tran->tran_scheme);
}
- nni_rwlock_unlock(&sp_tran_lk);
}
nni_sp_tran *
@@ -71,16 +68,13 @@ nni_sp_tran_find(const char *url)
// address is of the form "<scheme>://blah..."
nni_sp_tran *t;
- nni_rwlock_rdlock(&sp_tran_lk);
NNI_LIST_FOREACH (&sp_tran_list, t) {
size_t len = strlen(t->tran_scheme);
if ((strncmp(url, t->tran_scheme, len) == 0) &&
(url[len] == ':' || url[len] == '\0')) {
- nni_rwlock_unlock(&sp_tran_lk);
return (t);
}
}
- nni_rwlock_unlock(&sp_tran_lk);
return (NULL);
}