Date: Wed, 18 Jun 2003 09:44:23 -0700 (PDT) From: Julian Elischer <julian@elischer.org> To: deischen@freebsd.org Cc: freebsd-threads@freebsd.org Subject: Re: The first kse_create call Message-ID: <Pine.BSF.4.21.0306180942430.5566-100000@InterJet.elischer.org> In-Reply-To: <Pine.GSO.4.10.10306181216040.27338-100000@pcnet5.pcnet.com>
next in thread | previous in thread | raw e-mail | index | archive | help
Sergey, look at: /usr/src/tools/KSE/* the ksetest program just tests basic things the 'rr' program tests teh mechanism for quantum expiry for "round-robin" scheduling. On Wed, 18 Jun 2003, Daniel Eischen wrote: > On Wed, 18 Jun 2003, Sergey Kosyakov wrote: > > --- Daniel Eischen <eischen@vigrid.com> wrote: > > > > > > You have to have both a thread mailbox pointer set in the > > > KSE mailbox and you have to expire the quantum. The quantum > > > is system plus user time. It is not real time (e.g., a nanosleep() > > > does not expire quantum while it sleeps). > > > > I'm trying to do this: > > > > mbx.km_version=KSE_VER_0; > > mbx.km_func=uc_1; > > mbx.km_stack.ss_sp=stack_1; > > mbx.km_stack.ss_size=SIGSTKSZ; > > mbx.km_stack.ss_flags=SS_ONSTACK; > > > > ret=getcontext(&(thr_mbx.tm_context)); > > printf("getcontext %d\n",ret); > > If thr_mbx is the initial thread mailbox, you don't need > to get a context for it. The kernel will give you back > its context on an upcall when the thread resumes after > being blocked or after quantum expires; the thread mailbox > will be in the KSE mailbox completed list. > > > thr_mbx.tm_context.uc_link=NULL; > > thr_mbx.tm_context.uc_stack.ss_sp=thr_stack_1; > > thr_mbx.tm_context.uc_stack.ss_size=SIGSTKSZ; > > thr_mbx.tm_context.uc_stack.ss_flags=SS_ONSTACK; > > makecontext(&(thr_mbx.tm_context),func,0); > > Again, you only need to do the above for new threads so that > you can start them when you get an upcall and the current > thread is either not runnable or you choose to swap it out > for another thread. > > > thr_mbx.tm_uticks=10; > > thr_mbx.tm_sticks=0; > > You (application) don't set tm_uticks or tm_sticks. The kernel > does that to let you know how much time the thread has consumed. > > > mbx.km_curthread=&thr_mbx; > > ret=kse_create(&mbx,0); > > do > > { > > ++i; > > }while(1); > > > > And never got upcall. (But if I put printf in the loop I got the > > upcall). > > You're not setting km_quantum. It has to be done before the > kse_create() and cannot be changed afterwards (kernel only reads > it once I believe). You also have to make sure km_flags is 0. > > You get the upcall with a printf() because the thread eventually > blocks in the kernel. The above spin loop makes no system calls > and won't block. > > Using KSEs on your own is tricky. There is a lot to keep > track of. You've got to handle signals on upcalls, keep > track of whether the current thread has blocked or not, > and atomically set the thread mbx pointer in the KSE when > you switch to another thread (If you set the mbx pointer > before you switch to the new thread, then if you get > an upcall before switching, the kernel may overwrite the > thread context before you've finished with it. And it > might contain partial context of the KSE context). > See src/lib/libpthread/i386/i386/thr_switch.S. > > It is much easier to just use libpthread^Wlibkse :-) > > -- > Dan Eischen > > _______________________________________________ > freebsd-threads@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-threads > To unsubscribe, send any mail to "freebsd-threads-unsubscribe@freebsd.org" >
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0306180942430.5566-100000>