XINU
resched.c
Go to the documentation of this file.
1 
5 #include <xinu.h>
6 
8 struct defer Defer;
9 
22 void resched(void)
23 {
24  struct procent *ptold; /* Ptr to table entry for old process */
25  struct procent *ptnew; /* Ptr to table entry for new process */
26 
27  /* If rescheduling is deferred, record attempt and return */
28 
29  if (Defer.ndefers > 0)
30  {
31  Defer.attempt = TRUE;
32  return;
33  }
34 
35  /* Point to process table entry for the current (old) process */
36 
37  ptold = &proctab[currpid];
38 
39  if (ptold->prstate == PR_CURR)
40  { /* Process remains eligible */
41  if (ptold->prprio > firstkey(readylist))
42  {
43  return;
44  }
45 
46  /* Old process will no longer remain current */
47 
48  ptold->prstate = PR_READY;
49  insert(currpid, readylist, ptold->prprio);
50  }
51 
52  /* Force context switch to highest priority ready process */
53 
55  ptnew = &proctab[currpid];
56  ptnew->prstate = PR_CURR;
57  preempt = QUANTUM; /* Reset time slice for process */
58  ctxsw(&ptold->prstkptr, &ptnew->prstkptr);
59 
60  /* Old process returns here when resumed */
61 
62  return;
63 }
64 
65 /*------------------------------------------------------------------------
66  * resched_cntl - Control whether rescheduling is deferred or allowed
67  *------------------------------------------------------------------------
68  */
82 {
83  switch (defer)
84  {
85 
86  case DEFER_START: /* Handle a deferral request */
87 
88  if (Defer.ndefers++ == 0)
89  {
91  }
92  return OK;
93 
94  case DEFER_STOP: /* Handle end of deferral */
95  if (Defer.ndefers <= 0)
96  {
97  return SYSERR;
98  }
99  if ((--Defer.ndefers == 0) && Defer.attempt)
100  {
101  resched();
102  }
103  return OK;
104 
105  default:
106  return SYSERR;
107  }
108 }
pid32 currpid
現在実行中のプロセス。
Definition: initialize.c:32
#define PR_READY
プロセスが準備完了(READY)状態。
Definition: process.h:39
void ctxsw(void *, void *)
コンテキストスイッチを行う(ctxsw.S に定義がある)
bool8 attempt
延期中に再スケジューリングが実行されたかどうか
Definition: resched.h:21
全てのシステムヘッダファイルをインクルードする。
#define SYSERR
処理が失敗した場合
Definition: kernel.h:79
#define firstkey(q)
リスト中の最初のプロセスのキーを返す。
#define OK
処理が成功した場合
Definition: kernel.h:77
int32 status
ステータスを意味する返り値の型(OK/SYSERR)
Definition: kernel.h:57
pid32 dequeue(qid16)
プロセスキューテーブルからキューを削除し、リスト先頭のプロセスIDを返す。
Definition: queue.c:78
qid16 readylist
READY状態のプロセスリストに対するグローバルID.
Definition: ready.c:9
pri16 prprio
プロセスのスケジューリング優先度。
Definition: process.h:90
#define PR_CURR
プロセスが現在動作中。
Definition: process.h:37
#define FALSE
Boolean False(0)
Definition: kernel.h:63
#define TRUE
Boolean True(1)
Definition: kernel.h:65
#define DEFER_STOP
遅延リスケジューリングの停止
Definition: resched.h:10
#define QUANTUM
ミリ秒単位のタイムスライス
Definition: kernel.h:93
#define DEFER_START
遅延リスケジューリングの開始
Definition: resched.h:8
status resched_cntl(int32 defer)
再スケジューリングを延期させるか、もしくは許可させるかを制御する。
Definition: resched.c:81
int int32
符号あり32ビット整数(int)
Definition: kernel.h:11
遅延リスケジューリングに関連する項目を集約した構造体
Definition: resched.h:16
uint16 prstate
プロセス状態(PR_CURR, ..., etc)。
Definition: process.h:88
struct procent proctab[]
プロセステーブル。
Definition: initialize.c:23
struct defer Defer
遅延リスケジューリングに関連する項目を集約した構造体
Definition: resched.c:8
int32 ndefers
未処理の延期プロセスの数
Definition: resched.h:19
uint32 preempt
プリエンプションカウンタ
Definition: clkinit.c:9
status insert(pid32, qid16, int32)
優先度に基づいて、キューにプロセスを挿入する。
Definition: insert.c:20
void resched(void)
最優先の適切なプロセスにCPU実行権を渡す。
Definition: resched.c:22
プロセステーブル(32bitsの倍数)。
Definition: process.h:85
char * prstkptr
保存されたスタックポインタ。
Definition: process.h:92