The first kse_create call
Sergey Kosyakov
ks4usa at yahoo.com
Wed Jun 18 10:15:52 PDT 2003
--- Daniel Eischen <eischen at vigrid.com> wrote:
> On Wed, 18 Jun 2003, Sergey Kosyakov wrote:
> > --- Daniel Eischen <eischen at 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.
Yes, it works. I just was confused by your words "The quantum
is system plus user time" and did not clear flags. Thanks.
>
> It is much easier to just use libpthread^Wlibkse :-)
I'm just trying to understand can direct kse usage give additional
benefits for my needs or not. Also I did not see anything like KSE/SA
approach before, so now I have a chance to toy with it!
Thanks,
Sergey.
__________________________________
Do you Yahoo!?
SBC Yahoo! DSL - Now only $29.95 per month!
http://sbc.yahoo.com
More information about the freebsd-threads
mailing list