Date: Sun, 31 Jan 1999 06:33:40 -0500 (EST) From: Peter Dufault <dufault@hda.com> To: bde@zeta.org.au (Bruce Evans) Cc: current@FreeBSD.ORG, dufault@hda.com, bde@zeta.org.au Subject: Re: more about yield() versus sched_yield() Message-ID: <199901311133.GAA21441@hda.hda.com> In-Reply-To: <199901311057.VAA08719@godzilla.zeta.org.au> from Bruce Evans at "Jan 31, 99 09:57:07 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
> Another difference is that it correctly counts context switches as voluntary. Good point. The patched version calls maybe_resched(), and I'm adding the line at "<<<". (This also will let people who haven't looked at that code complain about the function interface - it doesn't bother me, macros could come later.) /* * prioritize: Compute a priority based on the type of scheduler. */ static priority_type prioritize(struct proc *p) { priority_type priority; int class = RTP_PRIO_BASE(p->p_rtprio.type); if (class == RTP_PRIO_NORMAL) { priority = (RTP_PRIO_NORMAL << 8) | (p->p_priority / PPQ); } else priority = (class << 8) | p->p_rtprio.prio; return priority; } /* * curpriority_set: Set the current process priority to that of the process * in the call. */ void curpriority_set(struct proc *p) { newcurpriority = prioritize(p); } /* * curpriority_cmp: Compare the priorities. Return: * <0: p < curpriority * 0: p == curpriority * >0: p > curpriority */ static int curpriority_cmp(struct proc *p) { priority_type prio = prioritize(p); return prio - newcurpriority; } /* * maybe_resched: Decide if you need to reschedule or not, * taking the priorities and schedulers into account. * * This function needs to be call AFTER chk->p_priority has * been updated. */ static void maybe_resched(struct proc *chk) { if (curproc == 0) need_resched(); else if (chk == curproc) { /* * If chk is curproc, we may need to preempt if * we're making our priority less favorable. */ if (curpriority_cmp(chk) > 0) { chk->p_stats->p_ru.ru_nvcsw++; /* <<< Adding */ need_resched(); } } /* * If chk is not the curproc, we want to preempt if chk has * a more favorable priority than curproc. * * We shouldn't preempt the current process because of the * priority of a sleeping or stopped process. * */ else if ((chk->p_flag & P_INMEM) && chk->p_stat == SRUN && curpriority_cmp(chk) < 0) { need_resched(); } } -- Peter Dufault (dufault@hda.com) Realtime development, Machine control, HD Associates, Inc. Safety critical systems, Agency approval To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199901311133.GAA21441>