summaryrefslogtreecommitdiffstats
path: root/lib/libpthread/thread
diff options
context:
space:
mode:
authorpeadar <peadar@FreeBSD.org>2006-12-18 17:08:07 +0000
committerpeadar <peadar@FreeBSD.org>2006-12-18 17:08:07 +0000
commite3b0678e20f86a88c1169dc2c9b44658eb2a1e99 (patch)
tree740e6b1372b7d2d7072cb29a4756a0cbacd3bc70 /lib/libpthread/thread
parentd09381af38eb06f88b9e25758d7d6af2c8ea358b (diff)
downloadFreeBSD-src-e3b0678e20f86a88c1169dc2c9b44658eb2a1e99.zip
FreeBSD-src-e3b0678e20f86a88c1169dc2c9b44658eb2a1e99.tar.gz
Clean bound and non-bound pthread structures consistently before
they become candidates for reuse. Without this fix, some of the state from a thread structure's previous incarnation could interfere with its new one. Specifically, a non-bound thread started as "suspended" (see pthread_attr_setcreatesuspend_np()) might not get scheduled at all when resumed, as the "active" flag would be set spuriously. Reviewed by: deischen@, davidxu@ MFC after: 1 week
Diffstat (limited to 'lib/libpthread/thread')
-rw-r--r--lib/libpthread/thread/thr_kern.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/lib/libpthread/thread/thr_kern.c b/lib/libpthread/thread/thr_kern.c
index f1b28c0..02ced94 100644
--- a/lib/libpthread/thread/thr_kern.c
+++ b/lib/libpthread/thread/thr_kern.c
@@ -764,7 +764,6 @@ kse_sched_single(struct kse_mailbox *kmbx)
break;
case PS_DEAD:
- curthread->check_pending = 0;
/* Unlock the scheduling queue and exit the KSE and thread. */
thr_cleanup(curkse, curthread);
KSE_SCHED_UNLOCK(curkse, curkse->k_kseg);
@@ -1150,6 +1149,11 @@ thr_cleanup(struct kse *curkse, struct pthread *thread)
struct kse_mailbox *kmbx = NULL;
int sys_scope;
+ thread->active = 0;
+ thread->need_switchout = 0;
+ thread->lock_switch = 0;
+ thread->check_pending = 0;
+
if ((joiner = thread->joiner) != NULL) {
/* Joinee scheduler lock held; joiner won't leave. */
if (joiner->kseg == curkse->k_kseg) {
@@ -1717,9 +1721,6 @@ kse_switchout_thread(struct kse *kse, struct pthread *thread)
* stack. It is safe to do garbage collecting
* here.
*/
- thread->active = 0;
- thread->need_switchout = 0;
- thread->lock_switch = 0;
thr_cleanup(kse, thread);
return;
break;
OpenPOWER on IntegriCloud