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