Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 May 2016 10:20:23 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r299114 - head/lib/libthr/thread
Message-ID:  <201605051020.u45AKNDV068667@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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--;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201605051020.u45AKNDV068667>