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); }