| plan 9 kernel history: overview | file list | diff list |
2002/0322/port/edf.c (diff list | history)
| 2002/0321/sys/src/9/port/edf.c:10,20 – 2002/0322/sys/src/9/port/edf.c:10,16 (short | long | prev | next) | ||
| 2002/0315 | /* debugging */ int edfprint = 0; | |
| 2002/0321/sys/src/9/port/edf.c:115,121 – 2002/0322/sys/src/9/port/edf.c:111,117 | ||
| 2002/0315 | { Taskq *q; | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edfpush, %s, %d\n", m->machno, edf_statename[t->state], t->runq.n); | |
| 2002/0315 | q = edfstack + m->machno; assert(t->runq.n || (up && up->task == t)); if (q->head){ | |
| 2002/0321/sys/src/9/port/edf.c:126,132 – 2002/0322/sys/src/9/port/edf.c:122,127 | ||
| 2002/0315 | t->rnext = q->head; | |
| 2002/0316 | if(devrt) devrt(t, now, SRun); | |
| 2002/0315 | q->head = t; | |
| 2002/0321/sys/src/9/port/edf.c:135,141 – 2002/0322/sys/src/9/port/edf.c:130,136 | ||
| 2002/0315 | Task *t; Taskq *q; | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edfpop\n", m->machno); | |
| 2002/0315 | q = edfstack + m->machno; if (t = q->head){ assert(t->state == EdfRunning); | |
| 2002/0321/sys/src/9/port/edf.c:147,153 – 2002/0322/sys/src/9/port/edf.c:142,147 | ||
| 2002/0316 | if(devrt) devrt(q->head, now, SRun); | |
| 2002/0315 | } } | |
| 2002/0321/sys/src/9/port/edf.c:157,167 – 2002/0322/sys/src/9/port/edf.c:151,160 | ||
| 2002/0315 | Task *tt, **ttp; ilock(q); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edfenqueue, %s, %d\n", m->machno, edf_statename[t->state], t->runq.n); | |
| 2002/0315 | t->rnext = nil; if (q->head == nil) { q->head = t; | |
| 2002/0321/sys/src/9/port/edf.c:178,184 – 2002/0322/sys/src/9/port/edf.c:171,176 | ||
| 2002/0315 | tt->rnext = t; if (t != q->head) t = nil; | |
| 2002/0321/sys/src/9/port/edf.c:188,194 – 2002/0322/sys/src/9/port/edf.c:180,186 | ||
| 2002/0315 | { Task *t; | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edfdequeue\n", m->machno); | |
| 2002/0315 | ilock(q); if (t = q->head){ q->head = t->rnext; | |
| 2002/0321/sys/src/9/port/edf.c:195,201 – 2002/0322/sys/src/9/port/edf.c:187,192 | ||
| 2002/0315 | t->rnext = nil; } iunlock(q); | |
| 2002/0321/sys/src/9/port/edf.c:205,220 – 2002/0322/sys/src/9/port/edf.c:196,209 | ||
| 2002/0315 | Task **tp; ilock(q); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edfqremove, %s, %d\n", m->machno, edf_statename[t->state], t->runq.n); | |
| 2002/0315 | for (tp = &q->head; *tp; tp = &(*tp)->rnext){ if (*tp == t){ *tp = t->rnext; | |
| 2002/0321/sys/src/9/port/edf.c:232,243 – 2002/0322/sys/src/9/port/edf.c:221,231 | ||
| 2002/0320 | iunlock(&edflock); return; } | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_block, %s, %d\n", m->machno, edf_statename[t->state], t->runq.n); | |
| 2002/0315 | if (t->runq.n){ /* There's another runnable proc in the running task, leave task where it is */ iunlock(&edflock); | |
| 2002/0321/sys/src/9/port/edf.c:244,250 – 2002/0322/sys/src/9/port/edf.c:232,237 | ||
| 2002/0315 | assert(pt == t); t->state = EdfBlocked; | |
| 2002/0316 | if(devrt) devrt(t, now, SBlock); | |
| 2002/0315 |
| |
| 2002/0321/sys/src/9/port/edf.c:254,260 – 2002/0322/sys/src/9/port/edf.c:241,247 | ||
| 2002/0315 | Task *t, *nt; /* Task has reached its deadline, lock must be held */ | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edfdeadline, %s, %d\n", m->machno, edf_statename[p->task->state], p->task->runq.n); | |
| 2002/0315 | SET(nt); if (p){ nt = p->task; | |
| 2002/0321/sys/src/9/port/edf.c:273,291 – 2002/0322/sys/src/9/port/edf.c:260,276 | ||
| 2002/0315 | t->state = EdfDeadline; | |
| 2002/0316 | if(devrt) devrt(t, now, why); | |
| 2002/0315 | edf_resched(t); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_deadline\n", m->machno); | |
| 2002/0315 | /* Task has reached its deadline */ ilock(&edflock); now = fastticks(nil); edfdeadline(p, SYield); iunlock(&edflock); | |
| 2002/0321/sys/src/9/port/edf.c:314,326 – 2002/0322/sys/src/9/port/edf.c:299,311 | ||
| 2002/0315 | return err; } ilock(&edflock); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_admit, %s, %d\n", m->machno, edf_statename[t->state], t->runq.n); | |
| 2002/0315 | now = fastticks(nil); t->state = EdfAdmitted; | |
| 2002/0316 | if(devrt) devrt(t, t->d, SAdmit); | |
| 2002/0315 | if (up->task == t){ | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_admitting self\n", m->machno); | |
| 2002/0315 | /* Admitting self, fake reaching deadline */ t->r = now; t->t = now + t->T; | |
| 2002/0321/sys/src/9/port/edf.c:347,353 – 2002/0322/sys/src/9/port/edf.c:332,337 | ||
| 2002/0315 | } } } | |
| 2002/0321/sys/src/9/port/edf.c:360,372 – 2002/0322/sys/src/9/port/edf.c:344,355 | ||
| 2002/0315 | qlock(&edfschedlock); ilock(&edflock); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_expel, %s, %d\n", m->machno, edf_statename[t->state], t->runq.n); | |
| 2002/0315 | now = fastticks(nil); switch(t->state){ case EdfUnused: case EdfExpelled: /* That was easy */ | |
| 2002/0321/sys/src/9/port/edf.c:398,404 – 2002/0322/sys/src/9/port/edf.c:381,386 | ||
| 2002/0315 | t->state = EdfExpelled; | |
| 2002/0316 | if(devrt) devrt(t, now, SExpel); | |
| 2002/0320 | setdelta(); | |
| 2002/0315 |
| |
| 2002/0321/sys/src/9/port/edf.c:450,456 – 2002/0322/sys/src/9/port/edf.c:432,438 | ||
| 2002/0315 | Ticks ticks; Task *t; | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_setclock\n", m->machno); | |
| 2002/0315 | ticks = ~0ULL; if ((t = qwaitrelease.head) && t->r < ticks) ticks = t->r; | |
| 2002/0321/sys/src/9/port/edf.c:461,486 – 2002/0322/sys/src/9/port/edf.c:443,466 | ||
| 2002/0315 | ticks = now + t->S; } if (schedpoint.when > now && schedpoint.when <= ticks){ | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d cycintrdel %T\n", m->machno, ticks2time(schedpoint.when)); | |
| 2002/0315 | cycintrdel(&schedpoint); schedpoint.when = 0; } if (ticks <= now){ | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_timer: %T too late\n", m->machno, ticks2time(now-ticks)); | |
| 2002/0315 | ticks = now; } if (ticks != ~0ULL) { | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d program timer in %T\n", m->machno, ticks2time(ticks-now)); | |
| 2002/0315 | schedpoint.when = ticks; cycintradd(&schedpoint); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d cycintradd %T\n", m->machno, ticks2time(schedpoint.when-now)); | |
| 2002/0315 | } clockintrsched(); | |
| 2002/0321/sys/src/9/port/edf.c:487,493 – 2002/0322/sys/src/9/port/edf.c:467,473 | ||
| 2002/0315 | edf_intr(Ureg *, Cycintr *cy) { | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_intr\n", m->machno); | |
| 2002/0315 | /* Timer interrupt * Timed events are: * 1. release a task (look in qwaitrelease) | |
| 2002/0321/sys/src/9/port/edf.c:504,510 – 2002/0322/sys/src/9/port/edf.c:484,489 | ||
| 2002/0315 | edf_timer(); edf_setclock(); iunlock(&edflock); | |
| 2002/0321/sys/src/9/port/edf.c:515,527 – 2002/0322/sys/src/9/port/edf.c:494,506 | ||
| 2002/0315 | Task *t; Proc **pp; | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_bury\n", m->machno); | |
| 2002/0315 | ilock(&edflock); now = fastticks(nil); if ((t = p->task) == nil){ /* race condition? */ iunlock(&edflock); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf bury race, pid %lud\n", m->machno, p->pid); | |
| 2002/0315 | return; } assert(edfstack[m->machno].head == t); | |
| 2002/0321/sys/src/9/port/edf.c:549,559 – 2002/0322/sys/src/9/port/edf.c:528,538 | ||
| 2002/0315 | Task *t; ilock(&edflock); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_ready, %s, %d\n", m->machno, edf_statename[p->task->state], p->task->runq.n); | |
| 2002/0315 | if ((t = p->task) == nil){ /* Must be a race */ iunlock(&edflock); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf ready race, pid %lud\n", m->machno, p->pid); | |
| 2002/0315 | return; } p->rnext = 0; | |
| 2002/0321/sys/src/9/port/edf.c:571,577 – 2002/0322/sys/src/9/port/edf.c:550,555 | ||
| 2002/0315 | now = fastticks(nil); edf_resched(t); } | |
| 2002/0321/sys/src/9/port/edf.c:580,586 – 2002/0322/sys/src/9/port/edf.c:558,564 | ||
| 2002/0315 | { Task *xt; | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_resched, %s, %d\n", m->machno, edf_statename[t->state], t->runq.n); | |
| 2002/0315 | if (t->nproc == 0){ /* No member processes */ if (t->state > EdfIdle){ | |
| 2002/0321/sys/src/9/port/edf.c:587,598 – 2002/0322/sys/src/9/port/edf.c:565,575 | ||
| 2002/0315 | t->state = EdfIdle; | |
| 2002/0316 | if(devrt) devrt(t, now, SBlock); | |
| 2002/0315 | } | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_resched, nothing runnable\n", m->machno); | |
| 2002/0315 | if (t->state == EdfRunning) edfpop(); | |
| 2002/0321/sys/src/9/port/edf.c:600,606 – 2002/0322/sys/src/9/port/edf.c:577,582 | ||
| 2002/0315 | t->state = EdfBlocked; | |
| 2002/0316 | if(devrt) devrt(t, now, SBlock); | |
| 2002/0315 | } | |
| 2002/0321/sys/src/9/port/edf.c:608,616 – 2002/0322/sys/src/9/port/edf.c:584,591 | ||
| 2002/0315 | switch (t->state){ case EdfUnused: | |
| 2002/0316 |
| |
| 2002/0322 | iprint("%d attempt to schedule unused task\n", m->machno); | |
| 2002/0315 | case EdfExpelled: | |
| 2002/0321/sys/src/9/port/edf.c:630,636 – 2002/0322/sys/src/9/port/edf.c:605,610 | ||
| 2002/0315 | case EdfAdmitted: /* test whether task can be started */ if (edfstack[m->machno].head != nil){ | |
| 2002/0321/sys/src/9/port/edf.c:637,656 – 2002/0322/sys/src/9/port/edf.c:611,628 | ||
| 2002/0315 | case EdfRunning: if (t->r <= now){ if (t->t < now){ | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_resched, rerelease\n", m->machno); | |
| 2002/0315 | /* Period passed, rerelease */ t->r = now; xt = edfpop(); assert(xt == t); edf_release(t); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_resched, resume\n", m->machno); | |
| 2002/0315 | /* Running, not yet at deadline, leave it */ | |
| 2002/0321/sys/src/9/port/edf.c:658,664 – 2002/0322/sys/src/9/port/edf.c:630,636 | ||
| 2002/0315 | /* Released, but deadline is past, release at t->t */ t->r = t->t; } | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_resched, schedule release\n", m->machno); | |
| 2002/0315 | xt = edfpop(); assert(xt == t); edfenqueue(&qwaitrelease, t); | |
| 2002/0321/sys/src/9/port/edf.c:669,689 – 2002/0322/sys/src/9/port/edf.c:641,659 | ||
| 2002/0315 | case EdfDeadline: if (t->r <= now){ if (t->t < now){ | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_resched, rerelease\n", m->machno); | |
| 2002/0315 | /* Period passed, rerelease */ t->r = now; edf_release(t); | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_resched, resume\n", m->machno); | |
| 2002/0315 | /* Released, not yet at deadline, release (again) */ t->state = EdfReleased; edfenqueue(&qreleased, t); | |
| 2002/0316 | if(devrt) devrt(t, now, SResume); | |
| 2002/0315 |
| |
| 2002/0321/sys/src/9/port/edf.c:691,709 – 2002/0322/sys/src/9/port/edf.c:661,678 | ||
| 2002/0315 | /* Released, but deadline is past, release at t->t */ t->r = t->t; } | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_resched, schedule release\n", m->machno); | |
| 2002/0315 | edfenqueue(&qwaitrelease, t); t->state = EdfAwaitrelease; edf_setclock(); break; } | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_release, %s, %d\n", m->machno, edf_statename[t->state], t->runq.n); | |
| 2002/0315 | assert(t->runq.n > 0 || (up && up->task == t)); t->t = t->r + t->T; t->d = t->r + t->D; | |
| 2002/0321/sys/src/9/port/edf.c:713,719 – 2002/0322/sys/src/9/port/edf.c:682,687 | ||
| 2002/0315 | edfenqueue(&qreleased, t); | |
| 2002/0316 | if(devrt) devrt(t, now, SRelease); | |
| 2002/0315 | edf_setclock(); | |
| 2002/0321/sys/src/9/port/edf.c:728,734 – 2002/0322/sys/src/9/port/edf.c:696,701 | ||
| 2002/0315 | /* Figure out if the current proc should be preempted*/ ilock(&edflock); | |
| 2002/0321/sys/src/9/port/edf.c:742,751 – 2002/0322/sys/src/9/port/edf.c:709,718 | ||
| 2002/0315 | iunlock(&edflock); return nil; } | |
| 2002/0322 | DPRINT("edf_runproc %lud\n", nilcount); | |
| 2002/0320 | if (nt && (t == nil || (nt->d < t->d && nt->D < t->Delta))){ | |
| 2002/0315 | /* released task is better than current */ | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_runproc: released\n", m->machno); | |
| 2002/0315 | edfdequeue(&qreleased); assert(nt->runq.n >= 1); edfpush(nt); | |
| 2002/0321/sys/src/9/port/edf.c:753,759 – 2002/0322/sys/src/9/port/edf.c:720,726 | ||
| 2002/0315 | t = nt; t->scheduled = now; }else{ | |
| 2002/0316 |
| |
| 2002/0322 | DPRINT("%d edf_runproc: current\n", m->machno); | |
| 2002/0315 | } assert (t->runq.n); | |
| 2002/0321/sys/src/9/port/edf.c:771,777 – 2002/0322/sys/src/9/port/edf.c:738,743 | ||
| 2002/0315 | p->movetime = MACHP(0)->ticks + HZ/10; p->mp = MACHP(m->machno); edf_setclock(); | |
| 2002/0321/sys/src/9/port/edf.c:781,787 – 2002/0322/sys/src/9/port/edf.c:747,752 | ||
| 2002/0315 | int edf_waitlock(Lock *l) { | |
| 2002/0321/sys/src/9/port/edf.c:802,808 – 2002/0322/sys/src/9/port/edf.c:767,772 | ||
| 2002/0315 | { Proc *p; | |