On Sat, Mar 02, 2019 at 10:29:07AM +0100, Sebastien Marie wrote:
> I am experiencing dead-lock with the new futex based rwlock
> implementation commited few days ago.

The problem happens if a read-write lock has been read-locked and
there are multiple writers waiting. The unlock routine will clear the
waiter flag and wake up a single waiter. If no new waiters emerge
before the next unlock, no wakeup will be issued.

A simple fix is to wake all waiters, so that no wakeup is lost.
That may cause a thundering herd effect with writers though. The
implementation could encode the number of waiters in `rwlock->value',
enabling more discreet wakeups. However, that needs more testing.

Does the following patch help?

Index: rthread_rwlock.c
===================================================================
RCS file: src/lib/librthread/rthread_rwlock.c,v
retrieving revision 1.12
diff -u -p -r1.12 rthread_rwlock.c
--- rthread_rwlock.c    13 Feb 2019 13:22:14 -0000      1.12
+++ rthread_rwlock.c    2 Mar 2019 13:35:31 -0000
@@ -273,7 +273,7 @@ pthread_rwlock_unlock(pthread_rwlock_t *
        } while (atomic_cas_uint(&rwlock->value, val, new) != val);
 
        if (new == UNLOCKED && (val & WAITING))
-               _wake(&rwlock->value, COUNT(val));
+               _wake(&rwlock->value, INT_MAX);
 
        return (0);
 }

Reply via email to