|
|
1.1 root 1: /* resched.c - resched */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <proc.h>
6: #include <q.h>
7:
8: /*------------------------------------------------------------------------
9: * resched -- reschedule processor to highest priority ready process
10: *
11: * Notes: Upon entry, currpid gives current process id.
12: * Proctab[currpid].pstate gives correct NEXT state for
13: * current process if other than PRCURR.
14: *------------------------------------------------------------------------
15: */
16: int resched()
17: {
18: register struct pentry *optr; /* pointer to old process entry */
19: register struct pentry *nptr; /* pointer to new process entry */
20:
21: /* no switch needed if current process priority higher than next*/
22:
23: if ( ( (optr= &proctab[currpid])->pstate == PRCURR) &&
24: (lastkey(rdytail)<optr->pprio))
25: return(OK);
26:
27: /* force context switch */
28:
29: if (optr->pstate == PRCURR) {
30: optr->pstate = PRREADY;
31: insert(currpid,rdyhead,optr->pprio);
32: }
33:
34: /* remove highest priority process at end of ready list */
35:
36: nptr = &proctab[ (currpid = getlast(rdytail)) ];
37: nptr->pstate = PRCURR; /* mark it currently running */
38: #ifdef STKCHK
39: if ( *( (int *)nptr->pbase ) != MAGIC ) {
40: kprintf("Bad magic pid=%d, value=%x, at %x\n",
41: currpid, *( (int *)nptr->pbase ), nptr->pbase);
42: panic("stack corrupted");
43: }
44: if ( ((unsigned)nptr->pregs[SPINDX]) < ((unsigned)nptr->plimit) ) {
45: kprintf("Bad SP pid=%d (%s), lim=%x will be %x\n",
46: currpid, nptr->pname, nptr->plimit,
47: nptr->pregs[SPINDX]);
48: panic("stack overflow");
49: }
50: #endif
51: #ifdef RTCLOCK
52: preempt = QUANTUM; /* reset preemption counter */
53: #endif
54: ctxsw(nptr->pregs);
55: return(OK);
56: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.