diff options
author | peadar <peadar@FreeBSD.org> | 2006-12-18 17:08:07 +0000 |
---|---|---|
committer | peadar <peadar@FreeBSD.org> | 2006-12-18 17:08:07 +0000 |
commit | e3b0678e20f86a88c1169dc2c9b44658eb2a1e99 (patch) | |
tree | 740e6b1372b7d2d7072cb29a4756a0cbacd3bc70 /lib | |
parent | d09381af38eb06f88b9e25758d7d6af2c8ea358b (diff) | |
download | FreeBSD-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')
-rw-r--r-- | lib/libkse/thread/thr_kern.c | 9 | ||||
-rw-r--r-- | lib/libpthread/thread/thr_kern.c | 9 |
2 files changed, 10 insertions, 8 deletions
diff --git a/lib/libkse/thread/thr_kern.c b/lib/libkse/thread/thr_kern.c index f1b28c0..02ced94 100644 --- a/lib/libkse/thread/thr_kern.c +++ b/lib/libkse/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; 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; |