libpthread problem + possible solution
Julian Elischer
julian at elischer.org
Fri Dec 15 12:14:48 PST 2006
Peter Edwards wrote:
> Hi,
>
> I've a problem when a process uses:
> libpthread
> detached threads
> mixed bound/unbound threads
> suspended threads (a la pthread_resume_np())
>
> whereby some newly created suspended threads don't get scheduled.
> I think I've tracked it down, so if someone could review the
> reasoning, I'd be grateful.
>
> Newly launched threads have a "struct pthread" that may be allocated
> from a freelist of GCed threads. Apparently, when detached threads
> enter the GCed list, they can still have the "active" flag set on
> them. Later, this causes problems when this thread is recycled and
> resumed, because _thr_setrunnable_unlocked() doesn't add it to a
> run queue.
>
> thr_cleanup can be called either from the bound-threads scheduler,
> or the unbound scheduler. One callsite clears "active", "needswitchout",
> and "lock_switch" to zero before the call. The other callsite just
> clears "check_pending". I think these flags are all either bound-thread
> or unbound-thread specific, and that there was an unintended
> assumption that the thread would remain with the same "boundedness"
> after being recycled, which isn't neccessarily the case. (Or another
> way - the idea was that there was no need to clear the "active"
> flag on a bound thread, as its only used for unbound threads, but
> a GCed bound thread might be recycled into an unbound thread)
>
> Given that, it seems correct to clean up the thread the same way
> for both cases, and just move that code into thr_cleanup. So, does
> the attached patch make sense? I can commit it if someone gives me
> the nod. (It definitely fixes my specific problem with threads not
> getting scheduled.)
your logic sounds sound.. I'll wait for DAN to make a pronouncement however.
>
>
> ------------------------------------------------------------------------
>
> Index: lib/libpthread/thread/thr_kern.c
> ===================================================================
> RCS file: /net/dyson/export/home/petere/FreeBSD-CVS/src/lib/libpthread/thread/thr_kern.c,v
> retrieving revision 1.116.2.1
> diff -u -r1.116.2.1 thr_kern.c
> --- lib/libpthread/thread/thr_kern.c 16 Mar 2006 23:29:07 -0000 1.116.2.1
> +++ lib/libpthread/thread/thr_kern.c 15 Dec 2006 17:48:20 -0000
> @@ -764,7 +764,6 @@
> 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 @@
> 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 @@
> * 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;
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> freebsd-threads at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-threads
> To unsubscribe, send any mail to "freebsd-threads-unsubscribe at freebsd.org"
More information about the freebsd-threads
mailing list