thread accounting in libpthread
Daniel Eischen
deischen at freebsd.org
Sun Feb 20 07:57:07 PST 2005
On Sun, 20 Feb 2005, Kazuaki Oda wrote:
> Daniel Eischen wrote:
>
> >If there was no running thread before kse_wait(), then after
> >kse_wait() returns and if there are completed threads, then
> >either one thread completed or N threads completed. Either
> >way, they are all added to the end of the run queue. But
> >the run queue must have been empty to begin with, otherwise
> >kse_wait() would not have been called. So it doesn't matter
> >whether they are added to the head or the end of the queue.
> >If one thread completes, then it will be run right away
> >since it will be the only thread in the queue. If N threads
> >complete (assuming they are all at the same priority) then
> >the first thread pulled from the completed list will be
> >run first since it will be the first thread added to the
> >run queue.
>
> Did you try to run the program attached to my past mail? If you run it
> under X11 terminal on a UP machine, you probably get a unfair result.
I don't get much of a difference with and without patch at
end. Depending on what your threads are blocking on, I
think it can be random.
with patch
----------
thread 00: 4716
thread 01: 4307
thread 02: 3631
thread 03: 3698
thread 04: 3455
without patch
-------------
thread 00: 4289
thread 01: 2903
thread 02: 4352
thread 03: 3444
thread 04: 4405
--
DE
Index: thread/thr_kern.c
===================================================================
RCS file: /opt/FreeBSD/cvs/src/lib/libpthread/thread/thr_kern.c,v
retrieving revision 1.116
diff -u -r1.116 thr_kern.c
--- thread/thr_kern.c 18 Dec 2004 18:07:37 -0000 1.116
+++ thread/thr_kern.c 20 Feb 2005 15:36:33 -0000
@@ -1465,14 +1465,22 @@
static void
kse_check_completed(struct kse *kse)
{
- struct pthread *thread;
+ TAILQ_HEAD(, pthread) completeq;
+ struct pthread *thread, *next;
struct kse_thr_mailbox *completed;
int sig;
if ((completed = kse->k_kcb->kcb_kmbx.km_completed) != NULL) {
+ TAILQ_INIT(&completeq);
kse->k_kcb->kcb_kmbx.km_completed = NULL;
while (completed != NULL) {
thread = completed->tm_udata;
+ TAILQ_INSERT_HEAD(&completeq, thread, pqe);
+ completed = completed->tm_next;
+ }
+ for (thread = TAILQ_FIRST(&completeq); thread != NULL;
+ thread = next) {
+ next = TAILQ_NEXT(thread, pqe);
DBG_MSG("Found completed thread %p, name %s\n",
thread,
(thread->name == NULL) ? "none" : thread->name);
@@ -1505,7 +1513,6 @@
&thread->tcb->tcb_tmbx.tm_syncsig);
thread->tcb->tcb_tmbx.tm_syncsig.si_signo = 0;
}
- completed = completed->tm_next;
}
}
}
More information about the freebsd-threads
mailing list