From c90998d3200d76a0730d9ea592b851bb77cb5c39 Mon Sep 17 00:00:00 2001 From: Costa Tsaousis Date: Tue, 20 Jun 2023 09:48:12 +0300 Subject: [PATCH] readers should be able to recursively acquire the lock, even when there is a writer waiting --- libnetdata/locks/locks.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/libnetdata/locks/locks.c b/libnetdata/locks/locks.c index 4061ba877e8625..0c02152f79d226 100644 --- a/libnetdata/locks/locks.c +++ b/libnetdata/locks/locks.c @@ -378,13 +378,20 @@ void rw_spinlock_read_unlock(RW_SPINLOCK *rw_spinlock) { void rw_spinlock_write_lock(RW_SPINLOCK *rw_spinlock) { static const struct timespec ns = { .tv_sec = 0, .tv_nsec = 1 }; - spinlock_lock(&rw_spinlock->spinlock); - size_t count = 0; - while (__atomic_load_n(&rw_spinlock->readers, __ATOMIC_RELAXED) > 0) { + size_t spins = 0; + while(1) { + spins++; + spinlock_lock(&rw_spinlock->spinlock); + + if(__atomic_load_n(&rw_spinlock->readers, __ATOMIC_RELAXED) == 0) + break; + // Busy wait until all readers have released their locks. - if(++count > 1000) - nanosleep(&ns, NULL); + spinlock_unlock(&rw_spinlock->spinlock); + nanosleep(&ns, NULL); } + + (void)spins; } void rw_spinlock_write_unlock(RW_SPINLOCK *rw_spinlock) {