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:
Attilio Rao 2009-07-06 09:31:04 +00:00
parent 3e0fc6d3f3
commit 137ae5d291
2 changed files with 4 additions and 1 deletions

View File

@ -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 {

View File

@ -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);
}