| 742 | } |
| 743 | |
| 744 | static bool __always_inline |
| 745 | __rw_runlock_try(struct rwlock *rw, struct thread *td, uintptr_t *vp) |
| 746 | { |
| 747 | |
| 748 | for (;;) { |
| 749 | if (RW_READERS(*vp) > 1 || !(*vp & RW_LOCK_WAITERS)) { |
| 750 | if (atomic_fcmpset_rel_ptr(&rw->rw_lock, vp, |
| 751 | *vp - RW_ONE_READER)) { |
| 752 | if (LOCK_LOG_TEST(&rw->lock_object, 0)) |
| 753 | CTR4(KTR_LOCK, |
| 754 | "%s: %p succeeded %p -> %p", |
| 755 | __func__, rw, (void *)*vp, |
| 756 | (void *)(*vp - RW_ONE_READER)); |
| 757 | td->td_rw_rlocks--; |
| 758 | return (true); |
| 759 | } |
| 760 | continue; |
| 761 | } |
| 762 | break; |
| 763 | } |
| 764 | return (false); |
| 765 | } |
| 766 | |
| 767 | static void __noinline |
| 768 | __rw_runlock_hard(struct rwlock *rw, struct thread *td, uintptr_t v |
no outgoing calls
no test coverage detected