libthr shared locks

Eric van Gyzen vangyzen at FreeBSD.org
Fri Feb 12 23:24:44 UTC 2016


On 12/23/2015 11:25, Konstantin Belousov wrote:
> The implementation in the patch
> https://www.kib.kiev.ua/kib/pshared/pshared.1.patch
> gives shared mutexes, condvars, rwlocks and barriers.

I reviewed everything except kern_umtx.c, which I plan to review on
Monday.  Here are my comments so far.

* thr_mutex.c

Thank you for converting some macros to functions.  I find functions
much cleaner and easier to read and debug.

* thr_mutex.c line 116

The parentheses around (m) can be removed now.

* thr_mutex.c lines 331-333

    m->m_qe.tqe_prev =
        TAILQ_NEXT(last_priv, m_qe)->
        m_qe.tqe_prev;                         

This seems to read the m_qe.tqe_prev field from a shared mutex.  Is that
safe?  It seems like a race.  The following would seem more direct,
avoiding the shared mutex:

    m->m_qe.tqe_prev = &TAILQ_NEXT(last_prev, m_qe);

* thr_mutex.c line 354

    *(q)->tqh_last = last_priv;

This seems to modify the tqe_next field in a shared mutex.  Is that
safe?  Furthermore, that mutex was/is the last on the list, but we seem
to set its tqe_next pointer to an earlier element, creating a cycle in
the list.

* thr_mutex.c line 451

__pthread_mutex_trylock() calls __thr_pshared_offpage() twice [for
pshared mutexes].  You could eliminate one call by moving
mutex_trylock_common() inline.

* thr_pshared.c line 165

res = NULL seems unnecessary.

* thr_pshared.c

In __thr_pshared_offpage(), can pshared_lookup() fail in the !doalloc
case?  pshared_hash seems to be an authority, not just an optimization. 
I ask so that I can understand the code and more effectively review it. 
In particular, if pshared_lookup() fails and UMTX_SHM_LOOKUP succeeds,
is it possible to get multiple mappings for the same shm object?

* thr_barrier.c line 110

    if (bar == NULL)
        return (EFAULT);

POSIX does not mention EFAULT.  Should we return ENOMEM, or can we
"extend" the standard?  (Ditto for all other _init functions.)

* thr_cond.c line 106

You could use cattr instead of the ?: expression.

* thr_rwlock.c

rwlock_init() assumes that __thr_pshared_offpage() does not fail.


More information about the freebsd-threads mailing list