Skip site navigation (1)Skip section navigation (2)
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>