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.

Reply via email to