threads/136345: commit references a PR

dfilter service dfilter at FreeBSD.ORG
Mon Jul 6 09:40:05 UTC 2009


The following reply was made to PR threads/136345; it has been noted by GNATS.

From: dfilter at FreeBSD.ORG (dfilter service)
To: bug-followup at FreeBSD.org
Cc:  
Subject: Re: threads/136345: commit references a PR
Date: Mon,  6 Jul 2009 09:31:15 +0000 (UTC)

 Author: attilio
 Date: Mon Jul  6 09:31:04 2009
 New Revision: 195403
 URL: http://svn.freebsd.org/changeset/base/195403
 
 Log:
   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
 
 Modified:
   head/lib/libthr/thread/thr_rtld.c
   head/lib/libthr/thread/thr_rwlock.c
 
 Modified: head/lib/libthr/thread/thr_rtld.c
 ==============================================================================
 --- head/lib/libthr/thread/thr_rtld.c	Mon Jul  6 09:07:35 2009	(r195402)
 +++ head/lib/libthr/thread/thr_rtld.c	Mon Jul  6 09:31:04 2009	(r195403)
 @@ -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 {
 
 Modified: head/lib/libthr/thread/thr_rwlock.c
 ==============================================================================
 --- head/lib/libthr/thread/thr_rwlock.c	Mon Jul  6 09:07:35 2009	(r195402)
 +++ head/lib/libthr/thread/thr_rwlock.c	Mon Jul  6 09:31:04 2009	(r195403)
 @@ -177,10 +177,11 @@ rwlock_rdlock_common(pthread_rwlock_t *r
  		/* 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);
  }
  
 _______________________________________________
 svn-src-all at freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
 


More information about the freebsd-threads mailing list