SCCS-vsn: sys/kern/kern_synch.c 6.7
-/* kern_synch.c 6.7 85/05/22 */
+/* kern_synch.c 6.7 85/05/27 */
#include "../machine/pte.h"
#include "../machine/pte.h"
#define SQSIZE 0100 /* Must be power of 2 */
#define HASH(x) (( (int) x >> 5) & (SQSIZE-1))
#define SQSIZE 0100 /* Must be power of 2 */
#define HASH(x) (( (int) x >> 5) & (SQSIZE-1))
-struct proc *slpque[SQSIZE];
+struct slpque {
+ struct proc *sq_head;
+ struct proc **sq_tailp;
+} slpque[SQSIZE];
/*
* Give up the processor till a wakeup occurs
/*
* Give up the processor till a wakeup occurs
- register struct proc *rp, **hp;
+ register struct proc *rp;
+ register struct slpque *qp;
register s;
rp = u.u_procp;
register s;
rp = u.u_procp;
rp->p_wchan = chan;
rp->p_slptime = 0;
rp->p_pri = pri;
rp->p_wchan = chan;
rp->p_slptime = 0;
rp->p_pri = pri;
- hp = &slpque[HASH(chan)];
- rp->p_link = *hp;
- *hp = rp;
+ qp = &slpque[HASH(chan)];
+ if (qp->sq_head == 0)
+ qp->sq_head = rp;
+ else
+ *qp->sq_tailp = rp;
+ *(qp->sq_tailp = &rp->p_link) = 0;
if (pri > PZERO) {
if (ISSIG(rp)) {
if (rp->p_wchan)
if (pri > PZERO) {
if (ISSIG(rp)) {
if (rp->p_wchan)
unsleep(p)
register struct proc *p;
{
unsleep(p)
register struct proc *p;
{
+ register struct slpque *qp;
register struct proc **hp;
register struct proc **hp;
s = splhigh();
if (p->p_wchan) {
s = splhigh();
if (p->p_wchan) {
- hp = &slpque[HASH(p->p_wchan)];
+ hp = &(qp = &slpque[HASH(p->p_wchan)])->sq_head;
while (*hp != p)
hp = &(*hp)->p_link;
*hp = p->p_link;
while (*hp != p)
hp = &(*hp)->p_link;
*hp = p->p_link;
+ if (qp->sq_tailp == &p->p_link)
+ qp->sq_tailp = hp;
p->p_wchan = 0;
}
splx(s);
p->p_wchan = 0;
}
splx(s);
wakeup(chan)
register caddr_t chan;
{
wakeup(chan)
register caddr_t chan;
{
- register struct proc *p, **q, **h;
+ register struct slpque *qp;
+ register struct proc *p, **q;
- h = &slpque[HASH(chan)];
+ qp = &slpque[HASH(chan)];
- for (q = h; p = *q; ) {
+ for (q = &qp->sq_head; p = *q; ) {
if (p->p_rlink || p->p_stat != SSLEEP && p->p_stat != SSTOP)
panic("wakeup");
if (p->p_wchan==chan) {
if (p->p_rlink || p->p_stat != SSLEEP && p->p_stat != SSTOP)
panic("wakeup");
if (p->p_wchan==chan) {
*q = p->p_link;
if (p->p_slptime > 1)
updatepri(p);
*q = p->p_link;
if (p->p_slptime > 1)
updatepri(p);
+ if (qp->sq_tailp == &p->p_link)
+ qp->sq_tailp = q;
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) */