Hello,

There appears to be a bug when using priority inheritance in combination with condition variables. I have some code that reproduces the bug:

https://github.com/edward-scott/musl-prio-inherit-cv-bug

Using git bisect I traced the origin of the bug to this commit:

https://git.musl-libc.org/cgit/musl/commit/?id=54ca677983d47529bab8752315ac1a2b49888870

which is the commit that is described as "implement priority inheritance mutexes".

From my analysis it appears that _m_waiters is used by the priority inheritance logic to maintain some state (as described in the commit message) but that conflicts with some use of _m_waiters in the condition variable implementation.

The consequence is that pthread_mutex_lock erroneously returns EDEADLK.

I don't understand the code well enough to produce a fix.

The demo code (a cut version of some production code) will reproduce the failure. Commenting out the pthread_mutexattr_setprotocol call in the iot_mutex_init function at the end of the thread.c file will cause the code to work as intended (without priority inheritance). The code works fine either way with the GNU lib.

BTW can I recommend that the "magic numbers"  used to represent mutex modes be replaced at some point with defined constants as it would make the code much easier to follow.

This is my first post to this list so I hope this message is on the right list and is helpful.

Edward Scott