#if MACH_LDEBUG
lck->lck_rw_deb.type = RW_TAG;
lck->lck_rw_attr |= (LCK_RW_ATTR_DEBUG|LCK_RW_ATTR_DIS_THREAD|LCK_RW_ATTR_DIS_MYLOCK);
+ lck->lck_rw.lck_rw_priv_excl = TRUE;
+#else
+ lck->lck_rw_priv_excl = TRUE;
#endif
}
}
} else {
(void) memset((void *) lck, 0, sizeof(lck_rw_t));
+ if ((lck_attr->lck_attr_val) & LCK_ATTR_RW_SHARED_PRIORITY)
+ lck->lck_rw_priv_excl = FALSE;
+ else
+ lck->lck_rw_priv_excl = TRUE;
}
lck_grp_reference(grp);
lck_attr_t *attr) {
bzero((void *)lck, sizeof(lck_rw_ext_t));
+ if ((attr->lck_attr_val) & LCK_ATTR_RW_SHARED_PRIORITY)
+ lck->lck_rw.lck_rw_priv_excl = FALSE;
+ else
+ lck->lck_rw.lck_rw_priv_excl = TRUE;
if ((attr->lck_attr_val) & LCK_ATTR_DEBUG) {
lck->lck_rw_deb.type = RW_TAG;
lck_rw_ilk_lock(lck);
- while (lck->lck_rw_want_excl || lck->lck_rw_want_upgrade) {
+ while ((lck->lck_rw_want_excl || lck->lck_rw_want_upgrade) &&
+ ((lck->lck_rw_shared_cnt == 0) || (lck->lck_rw_priv_excl))) {
i = lock_wait_time[1];
KERNEL_DEBUG(MACHDBG_CODE(DBG_MACH_LOCKS, LCK_RW_LCK_SHARED_CODE) | DBG_FUNC_START,
if (i != 0) {
lck_rw_ilk_unlock(lck);
- while (--i != 0 && (lck->lck_rw_want_excl || lck->lck_rw_want_upgrade))
+ while (--i != 0 &&
+ (lck->lck_rw_want_excl || lck->lck_rw_want_upgrade) &&
+ ((lck->lck_rw_shared_cnt == 0) || (lck->lck_rw_priv_excl)))
continue;
lck_rw_ilk_lock(lck);
}
- if (lck->lck_rw_want_excl || lck->lck_rw_want_upgrade) {
+ if ((lck->lck_rw_want_excl || lck->lck_rw_want_upgrade) &&
+ ((lck->lck_rw_shared_cnt == 0) || (lck->lck_rw_priv_excl))) {
lck->lck_rw_waiting = TRUE;
res = assert_wait((event_t)(((unsigned int*)lck)+((sizeof(lck_rw_t)-1)/sizeof(unsigned int))), THREAD_UNINT);
if (res == THREAD_WAITING) {
{
lck_rw_ilk_lock(lck);
- if (lck->lck_rw_want_excl || lck->lck_rw_want_upgrade) {
+ if ((lck->lck_rw_want_excl || lck->lck_rw_want_upgrade) &&
+ ((lck->lck_rw_shared_cnt == 0) || (lck->lck_rw_priv_excl))) {
lck_rw_ilk_unlock(lck);
return(FALSE);
}
if (lock_stat)
lck->lck_rw_grp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_util_cnt++;
- while (lck->lck_rw.lck_rw_want_excl || lck->lck_rw.lck_rw_want_upgrade) {
+ while ((lck->lck_rw.lck_rw_want_excl || lck->lck_rw.lck_rw_want_upgrade) &&
+ ((lck->lck_rw.lck_rw_shared_cnt == 0) || (lck->lck_rw.lck_rw_priv_excl))) {
i = lock_wait_time[1];
KERNEL_DEBUG(MACHDBG_CODE(DBG_MACH_LOCKS, LCK_RW_LCK_SHARED_CODE) | DBG_FUNC_START,
if (i != 0) {
lck_rw_ilk_unlock(&lck->lck_rw);
- while (--i != 0 && (lck->lck_rw.lck_rw_want_excl || lck->lck_rw.lck_rw_want_upgrade))
+ while (--i != 0 &&
+ (lck->lck_rw.lck_rw_want_excl || lck->lck_rw.lck_rw_want_upgrade) &&
+ ((lck->lck_rw.lck_rw_shared_cnt == 0) || (lck->lck_rw.lck_rw_priv_excl)))
continue;
lck_rw_ilk_lock(&lck->lck_rw);
}
- if (lck->lck_rw.lck_rw_want_excl || lck->lck_rw.lck_rw_want_upgrade) {
+ if ((lck->lck_rw.lck_rw_want_excl || lck->lck_rw.lck_rw_want_upgrade) &&
+ ((lck->lck_rw.lck_rw_shared_cnt == 0) || (lck->lck_rw.lck_rw_priv_excl))) {
lck->lck_rw.lck_rw_waiting = TRUE;
res = assert_wait((event_t)(((unsigned int*)rlck)+((sizeof(lck_rw_t)-1)/sizeof(unsigned int))), THREAD_UNINT);
if (res == THREAD_WAITING) {
if (lock_stat)
lck->lck_rw_grp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_util_cnt++;
- if (lck->lck_rw.lck_rw_want_excl || lck->lck_rw.lck_rw_want_upgrade) {
+ if ((lck->lck_rw.lck_rw_want_excl || lck->lck_rw.lck_rw_want_upgrade) &&
+ ((lck->lck_rw.lck_rw_shared_cnt == 0) || (lck->lck_rw.lck_rw_priv_excl))) {
if (lock_stat) {
lck->lck_rw_grp->lck_grp_stat.lck_grp_rw_stat.lck_grp_rw_miss_cnt++;
}