Date: Mon, 17 Jan 2000 07:20:12 -0500 From: "Daniel M. Eischen" <eischen@vigrid.com> To: archer@lucky.net Cc: hackers@FreeBSD.ORG Subject: Re: Preemptiveness of FreeBSD threads Message-ID: <388308FC.21812070@vigrid.com>
next in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------D1C1856A247A5E47C1DD8D01 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit > First, I must say that this all concernes quite current > CURRENT (Jan 9 or so). I don't know if the same holds for > older versions. > > I'm kind of puzzled. > > I've a simple sample program (see at the bottom). It creates 10 > threads with start function start_my_thread(), and then runs the > same function in main(). So, we have 11 threads doing the same job. > > Function start_my_thread() just increments indefinitely counters > (each thread has its own counter). > > Program, when killed with SIGINT, prints all counters and exits. > > Now, as I understand, userspace threads in FreeBSD are preemptive. > So, though my 11 threads are all computational and do not do > any syscalls, sleeps, sched_yield, whatever -- newertheless, > the program should not be stuck in one thread. And it seems to > be sometimes true. But only sometimes! > > Depending on the phase of the moon (it seems) sometimes my > program gives (after ^C): > > ^C > Thread 0x00: 0 > Thread 0x01: 0 > Thread 0x02: 0 > Thread 0x03: 0 > Thread 0x04: 0 > Thread 0x05: 0 > Thread 0x06: 0 > Thread 0x07: 0 > Thread 0x08: 0 > Thread 0x09: 0 > Thread 0x0a: 488133092 OK, with everyones help (well, waiting for the right time of day ;-)), I was able to reproduce this. The initial threads last active time was not getting initialized to a sane value, causing negative computations of the threads timeslice depending on what time of day it was. Funny thing was that I added this change several times, but each time I somehow convinced myself that it wasn't needed. Try this patch - you may have to hand apply it as my sources are not yet up to date with the last round of changes that Jason made. Dan Eischen eischen@vigrid.com --------------D1C1856A247A5E47C1DD8D01 Content-Type: text/plain; charset=us-ascii; name="diffs_init" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="diffs_init" Index: uthread_init.c =================================================================== RCS file: /opt/b/CVS/src/lib/libc_r/uthread/uthread_init.c,v retrieving revision 1.21 diff -c -r1.21 uthread_init.c *** uthread_init.c 1999/12/29 15:44:59 1.21 --- uthread_init.c 2000/01/17 11:47:06 *************** *** 92,97 **** --- 92,98 ---- int mib[2]; struct clockinfo clockinfo; struct sigaction act; + struct timeval tv; /* Check if this function has already been called: */ if (_thread_initial) *************** *** 222,227 **** --- 223,233 ---- /* Initialize the owned mutex queue and count: */ TAILQ_INIT(&(_thread_initial->mutexq)); _thread_initial->priority_mutex_count = 0; + + /* Initialize last active time to now: */ + gettimeofday(&tv, NULL); + _thread_initial->last_active.tv_sec = tv.tv_sec; + _thread_initial->last_active.tv_usec = tv.tv_usec; /* Initialise the rest of the fields: */ _thread_initial->poll_data.nfds = 0; --------------D1C1856A247A5E47C1DD8D01-- To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?388308FC.21812070>