From owner-freebsd-threads@FreeBSD.ORG Wed Jun 18 10:15:52 2003 Return-Path: Delivered-To: freebsd-threads@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 8574C37B401 for ; Wed, 18 Jun 2003 10:15:52 -0700 (PDT) Received: from web12406.mail.yahoo.com (web12406.mail.yahoo.com [216.136.173.133]) by mx1.FreeBSD.org (Postfix) with SMTP id B455643FAF for ; Wed, 18 Jun 2003 10:15:51 -0700 (PDT) (envelope-from ks4usa@yahoo.com) Message-ID: <20030618171551.38062.qmail@web12406.mail.yahoo.com> Received: from [12.29.176.205] by web12406.mail.yahoo.com via HTTP; Wed, 18 Jun 2003 10:15:51 PDT Date: Wed, 18 Jun 2003 10:15:51 -0700 (PDT) From: Sergey Kosyakov To: freebsd-threads@freebsd.org In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Subject: Re: The first kse_create call X-BeenThere: freebsd-threads@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Threading on FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 18 Jun 2003 17:15:52 -0000 --- Daniel Eischen wrote: > On Wed, 18 Jun 2003, Sergey Kosyakov wrote: > > --- Daniel Eischen 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