Date: Wed, 19 Nov 2014 12:51:06 +0900 From: Ryota Ozaki <ozak...@netbsd.org>
On Wed, Nov 19, 2014 at 3:11 AM, Taylor R Campbell <campbell+netbsd-tech-k...@mumble.net> wrote: > do { > refcnt = m->m_refcnt; > if (refcnt == 1) { > mutex_enter(&m->m_lock); > refcnt = atomic_dec_uint_nv(&m->m_refcnt); > if (refcnt == 0) > cv_broadcast(&m->m_cv); > mutex_exit(&m->m_lock); > } > } while (atomic_cas_uint(&m->m_refcnt, refcnt, refcnt - 1) != refcnt); BTW, do we need break after mutex_exit? Otherwise, m->m_refcnt is likely to be decremented twice when refcnt == 1. Yes -- typo in my hastily-written uncompiled untested code.