svn commit: r299114 - head/lib/libthr/thread

Konstantin Belousov kib at FreeBSD.org
Thu May 5 10:20:24 UTC 2016


Author: kib
Date: Thu May  5 10:20:22 2016
New Revision: 299114
URL: https://svnweb.freebsd.org/changeset/base/299114

Log:
  Do not leak THR_FLAGS_SUSPENDED from the previous suspend/resume
  cycle.  The flag currently is cleared by the resumed thread.  If next
  suspend request comes before the thread was able to clean the flag, in
  which case suspender skip the thread.
  
  Instead, clear the THR_FLAGS_SUSPEND flag in resume_common(), we do
  not care how much code was executed in the resumed thread when the
  pthread_resume_*np(s) functions returned.
  
  PR:	209233
  Reported by:	Lawrence Esswood <le277 at cam.ac.uk>
  MFC after:	1 week

Modified:
  head/lib/libthr/thread/thr_resume_np.c
  head/lib/libthr/thread/thr_sig.c

Modified: head/lib/libthr/thread/thr_resume_np.c
==============================================================================
--- head/lib/libthr/thread/thr_resume_np.c	Thu May  5 09:41:57 2016	(r299113)
+++ head/lib/libthr/thread/thr_resume_np.c	Thu May  5 10:20:22 2016	(r299114)
@@ -91,7 +91,7 @@ static void
 resume_common(struct pthread *thread)
 {
 	/* Clear the suspend flag: */
-	thread->flags &= ~THR_FLAGS_NEED_SUSPEND;
+	thread->flags &= ~(THR_FLAGS_NEED_SUSPEND | THR_FLAGS_SUSPENDED);
 	thread->cycle++;
 	_thr_umtx_wake(&thread->cycle, 1, 0);
 }

Modified: head/lib/libthr/thread/thr_sig.c
==============================================================================
--- head/lib/libthr/thread/thr_sig.c	Thu May  5 09:41:57 2016	(r299113)
+++ head/lib/libthr/thread/thr_sig.c	Thu May  5 10:20:22 2016	(r299114)
@@ -374,8 +374,7 @@ check_suspend(struct pthread *curthread)
 	 */
 	curthread->critical_count++;
 	THR_UMUTEX_LOCK(curthread, &(curthread)->lock);
-	while ((curthread->flags & (THR_FLAGS_NEED_SUSPEND |
-		THR_FLAGS_SUSPENDED)) == THR_FLAGS_NEED_SUSPEND) {
+	while ((curthread->flags & THR_FLAGS_NEED_SUSPEND) != 0) {
 		curthread->cycle++;
 		cycle = curthread->cycle;
 
@@ -392,7 +391,6 @@ check_suspend(struct pthread *curthread)
 		THR_UMUTEX_UNLOCK(curthread, &(curthread)->lock);
 		_thr_umtx_wait_uint(&curthread->cycle, cycle, NULL, 0);
 		THR_UMUTEX_LOCK(curthread, &(curthread)->lock);
-		curthread->flags &= ~THR_FLAGS_SUSPENDED;
 	}
 	THR_UMUTEX_UNLOCK(curthread, &(curthread)->lock);
 	curthread->critical_count--;


More information about the svn-src-head mailing list