On Sun, Aug 01, 2010 at 05:17:01PM -0700, Paul Goyette wrote: [...] > +void > +rmutex_enter(rmutex_t *rmtx) > +{ > + if (mutex_owned(&rmtx->rmtx_mtx)) { > + rmtx->rmtx_recurse++; > + KASSERT(rmtx->rmtx_recurse != 0); > + } else { > + mutex_enter(&rmtx->rmtx_mtx); > + rmtx->rmtx_recurse = 1; > + } > +} > + > +void > +rmutex_exit(rmutex_t *rmtx) > +{ > + KASSERT(mutex_owned(&rmtx->rmtx_mtx)); > + KASSERT(rmtx->rmtx_recurse != 0); > + if (--rmtx->rmtx_recurse == 0) > + mutex_exit(&rmtx->rmtx_mtx); > +} > + > +int > +rmutex_tryenter(rmutex_t *rmtx) > +{ > + int rv = 1; > + > + if (mutex_owned(&rmtx->rmtx_mtx)) { > + rmtx->rmtx_recurse++; > + KASSERT(rmtx->rmtx_recurse != 0); > + } else if ((rv = mutex_tryenter(&rmtx->rmtx_mtx)) != 0) { > + rmtx->rmtx_recurse++; > + KASSERT(rmtx->rmtx_recurse != 0); > + } > + return rv; > +} I am probably not getting the idea, but I fail to see how this qualifies as a mutex. My reading of this piece of code is that rmutex_enter() is always going to succeed immediately. Please correct me if I'm wrong--and I am very probably wrong--, but isn't the point of a recursive mutex to allow the thread initially taking the mutex to take it again, but not other threads? The code would have to be a lot more complicated than that. All I see here is a fancy no-op, but maybe it's just me. -- Quentin Garnier - cube%cubidou.net@localhost - cube%NetBSD.org@localhost "See the look on my face from staying too long in one place [...] every time the morning breaks I know I'm closer to falling" KT Tunstall, Saving My Face, Drastic Fantastic, 2007.
Attachment:
pgptUpB6P8Ib4.pgp
Description: PGP signature