PERFORCE change 52646 for review
Julian Elischer
julian at FreeBSD.org
Mon May 10 16:23:47 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=52646
Change 52646 by julian at julian_desk on 2004/05/10 16:23:03
finish IFC.. changes in parts of code that moved to a new file
Affected files ...
.. //depot/projects/nsched/sys/kern/kern_kse.c#5 edit
Differences ...
==== //depot/projects/nsched/sys/kern/kern_kse.c#5 (text+ko) ====
@@ -327,9 +327,12 @@
PROC_LOCK(p);
if (ku->ku_mflags & KMF_WAITSIGEVENT) {
/* UTS wants to wait for signal event */
- if (!(p->p_flag & P_SIGEVENT) && !(ku->ku_flags & KUF_DOUPCALL))
+ if (!(p->p_flag & P_SIGEVENT) && !(ku->ku_flags & KUF_DOUPCALL)) {
+ td->td_kflags |= TDK_KSERELSIG;
error = msleep(&p->p_siglist, &p->p_mtx, PPAUSE|PCATCH,
"ksesigwait", (uap->timeout ? tvtohz(&tv) : 0));
+ td->td_kflags &= ~(TDK_KSERELSIG | TDK_WAKEUP);
+ }
p->p_flag &= ~P_SIGEVENT;
sigset = p->p_siglist;
PROC_UNLOCK(p);
@@ -338,9 +341,11 @@
} else {
if (! kg->kg_completed && !(ku->ku_flags & KUF_DOUPCALL)) {
kg->kg_upsleeps++;
+ td->td_kflags |= TDK_KSEREL;
error = msleep(&kg->kg_completed, &p->p_mtx,
PPAUSE|PCATCH, "kserel",
(uap->timeout ? tvtohz(&tv) : 0));
+ td->td_kflags &= ~(TDK_KSEREL | TDK_WAKEUP);
kg->kg_upsleeps--;
}
PROC_UNLOCK(p);
@@ -384,31 +389,36 @@
} else {
kg = td->td_ksegrp;
if (kg->kg_upsleeps) {
+ mtx_unlock_spin(&sched_lock);
wakeup_one(&kg->kg_completed);
- mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
return (0);
}
ku = TAILQ_FIRST(&kg->kg_upcalls);
}
- if (ku) {
- if ((td2 = ku->ku_owner) == NULL) {
- panic("%s: no owner", __func__);
- } else if (TD_ON_SLEEPQ(td2) && (td2->td_flags & TDF_SINTR) &&
- ((td2->td_wchan == &kg->kg_completed) ||
- (td2->td_wchan == &p->p_siglist &&
- (ku->ku_mflags & KMF_WAITSIGEVENT)))) {
- sleepq_abort(td2);
- } else {
- ku->ku_flags |= KUF_DOUPCALL;
+ if (ku == NULL) {
+ mtx_unlock_spin(&sched_lock);
+ PROC_UNLOCK(p);
+ return (ESRCH);
+ }
+ if ((td2 = ku->ku_owner) == NULL) {
+ mtx_unlock_spin(&sched_lock);
+ panic("%s: no owner", __func__);
+ } else if (td2->td_kflags & (TDK_KSEREL | TDK_KSERELSIG)) {
+ mtx_unlock_spin(&sched_lock);
+ if (!(td2->td_kflags & TDK_WAKEUP)) {
+ td2->td_kflags |= TDK_WAKEUP;
+ if (td2->td_kflags & TDK_KSEREL)
+ sleepq_remove(td2, &kg->kg_completed);
+ else
+ sleepq_remove(td2, &p->p_siglist);
}
+ } else {
+ ku->ku_flags |= KUF_DOUPCALL;
mtx_unlock_spin(&sched_lock);
- PROC_UNLOCK(p);
- return (0);
}
- mtx_unlock_spin(&sched_lock);
PROC_UNLOCK(p);
- return (ESRCH);
+ return (0);
}
/*
More information about the p4-projects
mailing list