I believe RW_LOCK_HELD checks it's not held by the calling thread only. Note, a thread should not doubly read lock the same lock as a write lock from another thread between the 2 would deadlock.
Ricardo Correia wrote On 06/01/06 22:03,: > Hi, > > I think I found a bug in the rw_enter() implementation (emulation?) in > libzpool, file /usr/src/lib/libzpool/common/kernel.c: > > void > rw_enter(krwlock_t *rwlp, krw_t rw) > { > ASSERT(!RW_LOCK_HELD(rwlp)); > ASSERT(rwlp->rw_owner != (void *)-1UL); > ASSERT(rwlp->rw_owner != curthread); > > if (rw == RW_READER) > (void) rw_rdlock(&rwlp->rw_lock); > else > (void) rw_wrlock(&rwlp->rw_lock); > > rwlp->rw_owner = curthread; > } > > Doesn't RW_LOCK_HELD() check if there's a reader or a writer locked? If it > does, then these read-write locks would produce an assertion when multiple > readers tried to lock it. > > However, RW_LOCK_HELD() is being applied to "rwlp" instead > of "&rwlp->rw_lock", which could explain why it's not failing. > > Am I understanding this correctly? > > Unfortunately POSIX threads don't have an equivalent of rw_lock_held(), > rw_write_held(), mutex_held(), ..., so I really have to understand this in > order to somehow emulate their behavior. > > Thanks! > _______________________________________________ > zfs-code mailing list > zfs-code at opensolaris.org > http://opensolaris.org/mailman/listinfo/zfs-code