SCCS-vsn: sys/kern/kern_synch.c 3.9
-/* kern_synch.c 3.8 %H% */
+/* kern_synch.c 3.9 %H% */
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/param.h"
#include "../h/systm.h"
sleep(chan, pri)
caddr_t chan;
{
sleep(chan, pri)
caddr_t chan;
{
- register struct proc *rp;
+ register struct proc *rp, **hp;
register s, h;
rp = u.u_procp;
s = spl6();
if (chan==0 || rp->p_stat != SRUN || rp->p_rlink)
panic("sleep");
register s, h;
rp = u.u_procp;
s = spl6();
if (chan==0 || rp->p_stat != SRUN || rp->p_rlink)
panic("sleep");
rp->p_wchan = chan;
rp->p_slptime = 0;
rp->p_pri = pri;
rp->p_wchan = chan;
rp->p_slptime = 0;
rp->p_pri = pri;
- h = HASH(chan);
- rp->p_link = slpque[h];
- slpque[h] = rp;
+ hp = &slpque[HASH(chan)];
+ rp->p_link = *hp;
+ *hp = rp;
if(pri > PZERO) {
if(ISSIG(rp)) {
if(pri > PZERO) {
if(ISSIG(rp)) {
+ if (rp->p_wchan)
+ unsleep(rp);
- slpque[h] = rp->p_link;
(void) spl0();
goto psig;
}
(void) spl0();
goto psig;
}
+ if (rp->p_wchan == 0)
+ goto out;
+ rp->p_stat = SSLEEP;
(void) spl0();
if(runin != 0) {
runin = 0;
(void) spl0();
if(runin != 0) {
runin = 0;
(void) spl0();
swtch();
}
(void) spl0();
swtch();
}
wakeup(chan)
register caddr_t chan;
{
wakeup(chan)
register caddr_t chan;
{
- register struct proc *p, *q;
- register i;
+ register struct proc *p, **q, **h;
+ h = &slpque[HASH(chan)];
- p = slpque[i];
- q = NULL;
- while(p != NULL) {
+ for (q = h; p = *q; ) {
if (p->p_rlink || p->p_stat != SSLEEP && p->p_stat != SSTOP)
panic("wakeup");
if (p->p_wchan==chan && p->p_stat!=SZOMB) {
if (p->p_rlink || p->p_stat != SSLEEP && p->p_stat != SSTOP)
panic("wakeup");
if (p->p_wchan==chan && p->p_stat!=SZOMB) {
- if (q == NULL)
- slpque[i] = p->p_link;
- else
- q->p_link = p->p_link;
p->p_slptime = 0;
if (p->p_stat == SSLEEP) {
/* OPTIMIZED INLINE EXPANSION OF setrun(p) */
p->p_slptime = 0;
if (p->p_stat == SSLEEP) {
/* OPTIMIZED INLINE EXPANSION OF setrun(p) */
wakeup((caddr_t)&runout);
}
/* END INLINE EXPANSION */
wakeup((caddr_t)&runout);
}
/* END INLINE EXPANSION */
- goto restart;
- }
- q = p;
- p = p->p_link;
+ } else
+ q = &p->p_link;