In the current code, rdlock_count is not correctly handled for some cases.
The most notable is that it is not bumped in rwlock_rdlock_common() when the hard path (__thr_rwlock_rdlock()) returns successfully. This can lead to deadlocks in libthr when rwlocks recursion in read mode happens. Fix the interested parts by correctly handling rdlock_count. PR: threads/136345 Reported by: rink Tested by: rink Reviewed by: jeff Approved by: re (kib) MFC: 2 weeks
This commit is contained in:
parent
3e0fc6d3f3
commit
137ae5d291
@ -114,6 +114,7 @@ _thr_rtld_rlock_acquire(void *lock)
|
||||
THR_CRITICAL_ENTER(curthread);
|
||||
while (_thr_rwlock_rdlock(&l->lock, 0, NULL) != 0)
|
||||
;
|
||||
curthread->rdlock_count++;
|
||||
RESTORE_ERRNO();
|
||||
}
|
||||
|
||||
@ -148,6 +149,7 @@ _thr_rtld_lock_release(void *lock)
|
||||
|
||||
state = l->lock.rw_state;
|
||||
if (_thr_rwlock_unlock(&l->lock) == 0) {
|
||||
curthread->rdlock_count--;
|
||||
if ((state & URWLOCK_WRITE_OWNER) == 0) {
|
||||
THR_CRITICAL_LEAVE(curthread);
|
||||
} else {
|
||||
|
@ -177,10 +177,11 @@ rwlock_rdlock_common(pthread_rwlock_t *rwlock, const struct timespec *abstime)
|
||||
/* if interrupted, try to lock it in userland again. */
|
||||
if (_thr_rwlock_tryrdlock(&prwlock->lock, flags) == 0) {
|
||||
ret = 0;
|
||||
curthread->rdlock_count++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (ret == 0)
|
||||
curthread->rdlock_count++;
|
||||
return (ret);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user