source: anotherchoice/tags/jsp-1.4.4-full-UTF8/kernel/wait.c@ 26

Last change on this file since 26 was 26, checked in by ykominami, 12 years ago

initial

File size: 6.4 KB
RevLine 
[26]1/*
2 * TOPPERS/JSP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 *
9 * 上記著作権者
10は,以下の (1)〜(4) の条件か,Free Software Foundation
11 * によってå…
12¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
16 * 利用と呼ぶ)することを無償で許諾する.
17 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
18 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * スコード中に含まれていること.
20 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
21 * 用できる形で再é…
22å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
23å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
24 * 者
25マニュアルなど)に,上記の著作権表示,この利用条件および下記
26 * の無保証規定を掲載すること.
27 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
28 * 用できない形で再é…
29å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
30 * と.
31 * (a) 再é…
32å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
33マニュアルなど)に,上記の著
34 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
35 * (b) 再é…
36å¸ƒã®å½¢æ…
37‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者
41およびTOPPERSプロジェクトをå…
42è²¬ã™ã‚‹ã“と.
43 *
44 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
45お
46 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
47 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
48 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
49 *
50 * @(#) $Id: wait.c,v 1.6 2003/06/04 01:46:16 hiro Exp $
51 */
52
53/*
54 * 待
55ち状æ…
56‹ç®¡ç†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«
57 */
58
59#include "jsp_kernel.h"
60#include "wait.h"
61
62/*
63 * 待
64ち状æ…
65‹ã¸ã®ç§»è¡Œï¼ˆã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæŒ‡å®šï¼‰
66 *
67 */
68#ifdef __waimake
69
70void
71make_wait_tmout(WINFO *winfo, TMEVTB *tmevtb, TMO tmout)
72{
73 make_non_runnable(runtsk);
74 runtsk->winfo = winfo;
75 if (tmout > 0) {
76 winfo->tmevtb = tmevtb;
77 tmevtb_enqueue(tmevtb, (RELTIM) tmout,
78 (CBACK) wait_tmout, (VP) runtsk);
79 }
80 else {
81 assert(tmout == TMO_FEVR);
82 winfo->tmevtb = NULL;
83 }
84}
85
86#endif /* __waimake */
87
88/*
89 * 待
90ち解除のためのタスク状æ…
91‹ã®æ›´æ–°
92 *
93 * tcb で指定されるタスクを,待
94ち解除するようタスク状æ…
95‹ã‚’更新する.待
96
97 * ち解除するタスクが実行できる状æ…
98‹ã«ãªã‚‹å ´åˆã¯ï¼Œãƒ¬ãƒ‡ã‚£ã‚­ãƒ¥ãƒ¼ã«ã¤ãªãï¼Ž
99 * また,ディスパッチが必
100要な場合には TRUE を返す.
101 */
102Inline BOOL
103make_non_wait(TCB *tcb)
104{
105 assert(TSTAT_WAITING(tcb->tstat));
106
107 if (!(TSTAT_SUSPENDED(tcb->tstat))) {
108 /*
109 * 待
110ち状æ…
111‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
112‹ã¸ã®é·ç§»
113 */
114 return(make_runnable(tcb));
115 }
116 else {
117 /*
118 * 二重待
119ち状æ…
120‹ã‹ã‚‰å¼·åˆ¶å¾…
121ち状æ…
122‹ã¸ã®é·ç§»
123 */
124 tcb->tstat = TS_SUSPENDED;
125 LOG_TSKSTAT(tcb);
126 return(FALSE);
127 }
128}
129
130/*
131 * 待
132ち解除
133 */
134#ifdef __waicmp
135
136BOOL
137wait_complete(TCB *tcb)
138{
139 if (tcb->winfo->tmevtb != NULL) {
140 tmevtb_dequeue(tcb->winfo->tmevtb);
141 }
142 tcb->winfo->wercd = E_OK;
143 return(make_non_wait(tcb));
144}
145
146#endif /* __waicmp */
147
148/*
149 * タイムアウトに伴う待
150ち解除
151 */
152#ifdef __waitmo
153
154void
155wait_tmout(TCB *tcb)
156{
157 if ((tcb->tstat & TS_WAIT_WOBJ) != 0) {
158 queue_delete(&(tcb->task_queue));
159 }
160 tcb->winfo->wercd = E_TMOUT;
161 if (make_non_wait(tcb)) {
162 reqflg = TRUE;
163 }
164}
165
166#endif /* __waitmo */
167#ifdef __waitmook
168
169void
170wait_tmout_ok(TCB *tcb)
171{
172 tcb->winfo->wercd = E_OK;
173 if (make_non_wait(tcb)) {
174 reqflg = TRUE;
175 }
176}
177
178#endif /* __waitmook */
179
180/*
181 * 待
182ち状æ…
183‹ã®å¼·åˆ¶è§£é™¤
184 */
185#ifdef __waican
186
187void
188wait_cancel(TCB *tcb)
189{
190 if (tcb->winfo->tmevtb != NULL) {
191 tmevtb_dequeue(tcb->winfo->tmevtb);
192 }
193 if ((tcb->tstat & TS_WAIT_WOBJ) != 0) {
194 queue_delete(&(tcb->task_queue));
195 }
196}
197
198#endif /* __waican */
199#ifdef __wairel
200
201BOOL
202wait_release(TCB *tcb)
203{
204 wait_cancel(tcb);
205 tcb->winfo->wercd = E_RLWAI;
206 return(make_non_wait(tcb));
207}
208
209#endif /* __wairel */
210
211/*
212 * タスクの優å…
213ˆåº¦é †ã®å¾…
214ちキューへの挿å…
215¥
216 */
217Inline void
218queue_insert_tpri(TCB *tcb, QUEUE *queue)
219{
220 QUEUE *entry;
221 UINT priority = tcb->priority;
222
223 for (entry = queue->next; entry != queue; entry = entry->next) {
224 if (priority < ((TCB *) entry)->priority) {
225 break;
226 }
227 }
228 queue_insert_prev(entry, &(tcb->task_queue));
229}
230
231/*
232 * 実行中のタスクの同期・通信オブジェクトの待
233ちキューへの挿å…
234¥
235 */
236Inline void
237wobj_queue_insert(WOBJCB *wobjcb)
238{
239 if ((wobjcb->wobjinib->wobjatr & TA_TPRI) != 0) {
240 queue_insert_tpri(runtsk, &(wobjcb->wait_queue));
241 }
242 else {
243 queue_insert_prev(&(wobjcb->wait_queue),
244 &(runtsk->task_queue));
245 }
246}
247
248/*
249 * 同期・通信オブジェクトに対する待
250ち状æ…
251‹ã¸ã®ç§»è¡Œ
252 */
253#ifdef __wobjwai
254
255void
256wobj_make_wait(WOBJCB *wobjcb, WINFO_WOBJ *winfo)
257{
258 runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ | TS_WAIT_WOBJCB);
259 make_wait(&(winfo->winfo));
260 wobj_queue_insert(wobjcb);
261 winfo->wobjcb = wobjcb;
262 LOG_TSKSTAT(runtsk);
263}
264
265#endif /* __wobjwai */
266#ifdef __wobjwaitmo
267
268void
269wobj_make_wait_tmout(WOBJCB *wobjcb, WINFO_WOBJ *winfo,
270 TMEVTB *tmevtb, TMO tmout)
271{
272 runtsk->tstat = (TS_WAITING | TS_WAIT_WOBJ | TS_WAIT_WOBJCB);
273 make_wait_tmout(&(winfo->winfo), tmevtb, tmout);
274 wobj_queue_insert(wobjcb);
275 winfo->wobjcb = wobjcb;
276 LOG_TSKSTAT(runtsk);
277}
278
279#endif /* __wobjwaitmo */
280/*
281 * タスクの優å…
282ˆåº¦å¤‰æ›´æ™‚の処理
283 */
284#ifdef __wobjpri
285
286void
287wobj_change_priority(WOBJCB *wobjcb, TCB *tcb)
288{
289 if ((wobjcb->wobjinib->wobjatr & TA_TPRI) != 0) {
290 queue_delete(&(tcb->task_queue));
291 queue_insert_tpri(tcb, &(wobjcb->wait_queue));
292 }
293}
294
295#endif /* __wobjpri */
Note: See TracBrowser for help on using the repository browser.