[Lldb-commits] m_private_run_lock relying on undefined pthread behaviour

Ed Maste emaste at freebsd.org
Tue Jun 18 12:44:34 CDT 2013


On FreeBSD lldb currently hangs for me when trying to launch a
process; it gets stuck in the m_private_run_lock.WriteLock() in
Process::SetPrivateState().  After digging into this a bit it appears
to be due to the lock relying on undefined behaviour in
pthread_rwlock_unlock().

POSIX used to require EPERM for the case of calling unlock on a lock
not held by the current thread, but this has now been downgraded to
undefined behaviour[1].  AFAICT both Linux and OS X allow a lock from
one thread and unlock from another, but FreeBSD fails with EPERM, and
the m_private_run_lock fails to be unlocked.  Then the subsequent lock
call hangs.

I'm not sure if the locking & unlocking from different threads is
fundamental to the way lldb operates; if so, I suspect it's fairly
straightforward to migrate to a different locking strategy.  I can
have a go at implementing that but I hope to get feedback from someone
familiar with this first.

[1] http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_rwlock_unlock.html


More information about the lldb-commits mailing list