| plan 9 kernel history: overview | file list | diff list |
2002/0320/port/edf.c (diff list | history)
| 2002/0319/sys/src/9/port/edf.c:72,79 – 2002/0320/sys/src/9/port/edf.c:72,79 (short | long | prev | next) | ||
| 2002/0315 | static void edf_intr(Ureg*, Cycintr*); static void edf_resched(Task *t); | |
| 2002/0320 | static void setdelta(void); static void testdelta(Task *thetask); | |
| 2002/0315 | static char * edf_testschedulability(Task *thetask); static void edf_setclock(void); | |
| 2002/0319/sys/src/9/port/edf.c:226,235 – 2002/0320/sys/src/9/port/edf.c:226,239 | ||
| 2002/0315 | /* The current proc has blocked */ ilock(&edflock); t = p->task; | |
| 2002/0320 | assert(t); if (t->state != EdfRunning){ /* called by a proc just joining the task */ iunlock(&edflock); return; } | |
| 2002/0316 | DENTER("%.*s%d edf_block, %s, %d\n", ind, tabs, m->machno, edf_statename[t->state], t->runq.n); | |
| 2002/0315 |
| |
| 2002/0319/sys/src/9/port/edf.c:255,266 – 2002/0320/sys/src/9/port/edf.c:259,269 | ||
| 2002/0315 | if (p){ nt = p->task; assert(nt); | |
| 2002/0316 |
| |
| 2002/0320 | iprint("edfdeadline, %s, %d\n", edf_statename[p->task->state], p->task->runq.n); | |
| 2002/0315 | iunlock(&edflock); assert(0 && p == nil || nt == t); } | |
| 2002/0319/sys/src/9/port/edf.c:326,332 – 2002/0320/sys/src/9/port/edf.c:329,335 | ||
| 2002/0315 | t->scheduled = now; t->state = EdfRunning; | |
| 2002/0316 | if(devrt) devrt(t, now, SRun); | |
| 2002/0315 |
| |
| 2002/0320 | setdelta(); | |
| 2002/0315 | assert(t->runq.n > 0 || (up && up->task == t)); edfpush(t); edf_setclock(); | |
| 2002/0319/sys/src/9/port/edf.c:336,342 – 2002/0320/sys/src/9/port/edf.c:339,345 | ||
| 2002/0315 | t->state = EdfAdmitted; t->r = now; edf_release(t); | |
| 2002/0320 | setdelta(); | |
| 2002/0315 | edf_resched(t); }else{ edfenqueue(&qadmit, t); | |
| 2002/0319/sys/src/9/port/edf.c:393,399 – 2002/0320/sys/src/9/port/edf.c:396,402 | ||
| 2002/0315 | } t->state = EdfExpelled; | |
| 2002/0316 | if(devrt) devrt(t, now, SExpel); | |
| 2002/0315 |
| |
| 2002/0320 | setdelta(); | |
| 2002/0315 | DLEAVE; iunlock(&edflock); qunlock(&edfschedlock); | |
| 2002/0319/sys/src/9/port/edf.c:739,745 – 2002/0320/sys/src/9/port/edf.c:742,748 | ||
| 2002/0315 | return nil; } DENTER("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 | DPRINT("%.*s%d edf_runproc: released\n", ind, tabs, m->machno); | |
| 2002/0315 | edfdequeue(&qreleased); | |
| 2002/0319/sys/src/9/port/edf.c:777,784 – 2002/0320/sys/src/9/port/edf.c:780,785 | ||
| 2002/0315 | int edf_waitlock(Lock *l) { | |
| 2002/0319 |
| |
| 2002/0315 | iprint("edf_waitlock\n"); ilock(&waitlock); /* can't afford normal locks here */ if (l->key == 0){ | |
| 2002/0319/sys/src/9/port/edf.c:820,826 – 2002/0320/sys/src/9/port/edf.c:821,827 | ||
| 2002/0315 | /* Schedulability testing and its supporting routines */ static void | |
| 2002/0320 | setdelta(void) | |
| 2002/0315 | { Resource *r, **rr; Task **tt, *t; | |
| 2002/0319/sys/src/9/port/edf.c:828,850 – 2002/0320/sys/src/9/port/edf.c:829,851 | ||
| 2002/0315 | for (r = resources; r < resources + nelem(resources); r++){ if (r->name == nil) continue; | |
| 2002/0320 | r->Delta = ~0LL; | |
| 2002/0315 | for (tt = r->tasks; tt < r->tasks + nelem(r->tasks); tt++) | |
| 2002/0320 | if (*tt && (*tt)->D < r->Delta) r->Delta = (*tt)->D; | |
| 2002/0315 | } for (t = tasks; t < tasks + nelem(tasks); t++){ if (t->state < EdfIdle) continue; | |
| 2002/0320 | t->Delta = t->D; | |
| 2002/0315 | for (rr = t->res; rr < t->res + nelem(t->res); rr++) | |
| 2002/0320 | if (*rr && (*rr)->Delta < t->Delta) t->Delta = (*rr)->Delta; | |
| 2002/0315 | } } static void | |
| 2002/0320 | testdelta(Task *thetask) | |
| 2002/0315 | { Resource *r, **rr; Task **tt, *t; | |
| 2002/0319/sys/src/9/port/edf.c:852,869 – 2002/0320/sys/src/9/port/edf.c:853,870 | ||
| 2002/0315 | for (r = resources; r < resources + nelem(resources); r++){ if (r->name == nil) continue; | |
| 2002/0320 | r->testDelta = ~0ULL; | |
| 2002/0315 | for (tt = r->tasks; tt < r->tasks + nelem(r->tasks); tt++) | |
| 2002/0320 | if (*tt && (*tt)->D < r->testDelta) r->testDelta = (*tt)->D; | |
| 2002/0315 | } for (t = tasks; t < tasks + nelem(tasks); t++){ if (t->state <= EdfExpelled && t != thetask) continue; | |
| 2002/0320 | t->testDelta = t->D; | |
| 2002/0315 | for (rr = t->res; rr < t->res + nelem(t->res); rr++) | |
| 2002/0320 | if (*rr && (*rr)->testDelta < t->testDelta) t->testDelta = (*rr)->testDelta; | |
| 2002/0315 | } } | |
| 2002/0319/sys/src/9/port/edf.c:877,883 – 2002/0320/sys/src/9/port/edf.c:878,884 | ||
| 2002/0315 | for (t = tasks; t < tasks + Maxtasks; t++){ if (t->state <= EdfExpelled && t != thetask) continue; | |
| 2002/0320 | if (t->testDelta <= ticks && ticks < t->D && Cb < t->C) | |
| 2002/0315 | Cb = t->C; } return Cb; | |
| 2002/0319/sys/src/9/port/edf.c:917,923 – 2002/0320/sys/src/9/port/edf.c:918,924 | ||
| 2002/0315 | int steps; /* initialize */ | |
| 2002/0320 | testdelta(thetask); | |
| 2002/0315 | if (thetask && (thetask->flags & Verbose)) pprint("schedulability test\n"); qschedulability = nil; | |
| 2002/0319/sys/src/9/port/edf.c:986,991 – 2002/0320/sys/src/9/port/edf.c:987,994 | ||
| 2002/0315 | ticks2time(Ticks ticks) { assert(ticks >= 0); | |
| 2002/0320 | if (fasthz == 0) fastticks(&fasthz); | |
| 2002/0315 | return uvmuldiv(ticks, Onesecond, fasthz); } | |