Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Jun 2003 10:15:51 -0700 (PDT)
From:      Sergey Kosyakov <ks4usa@yahoo.com>
To:        freebsd-threads@freebsd.org
Subject:   Re: The first kse_create call
Message-ID:  <20030618171551.38062.qmail@web12406.mail.yahoo.com>
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
--- Daniel Eischen <eischen@vigrid.com> 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.

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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030618171551.38062.qmail>