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

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

initial

File size: 8.9 KB
Line 
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: eventflag.c,v 1.8 2003/06/04 01:46:16 hiro Exp $
51 */
52
53/*
54 * イベントフラグ機能
55 */
56
57#include "jsp_kernel.h"
58#include "check.h"
59#include "task.h"
60#include "wait.h"
61#include "eventflag.h"
62
63/*
64 * イベントフラグIDの最大値(kernel_cfg.c)
65 */
66extern const ID tmax_flgid;
67
68/*
69 * イベントフラグ初期化ブロックのエリア(kernel_cfg.c)
70 */
71extern const FLGINIB flginib_table[];
72
73/*
74 * イベントフラグ管理ブロックのエリア(kernel_cfg.c)
75 */
76extern FLGCB flgcb_table[];
77
78/*
79 * イベントフラグの数
80 */
81#define TNUM_FLG ((UINT)(tmax_flgid - TMIN_FLGID + 1))
82
83/*
84 * イベントフラグIDからイベントフラグ管理ブロックを取り出すためのマクロ
85 */
86#define INDEX_FLG(flgid) ((UINT)((flgid) - TMIN_FLGID))
87#define get_flgcb(flgid) (&(flgcb_table[INDEX_FLG(flgid)]))
88
89/*
90 * イベントフラグ待
91ち情
92報ブロックの定義
93 *
94 * flgptn は,waiptn および wfmode と同時に使うことはないため,union
95 * を使えばメモリを節約することが可能である.
96 */
97typedef struct eventflag_waiting_information {
98 WINFO winfo; /* 標準の待
99ち情
100報ブロック */
101 WOBJCB *wobjcb; /* 待
102ちオブジェクトの管理ブロック */
103 FLGPTN waiptn; /* 待
104ちパターン */
105 MODE wfmode; /* 待
106ちモード */
107 FLGPTN flgptn; /* 待
108ち解除時のパターン */
109} WINFO_FLG;
110
111/*
112 * イベントフラグ機能の初期化
113 */
114#ifdef __flgini
115
116void
117eventflag_initialize(void)
118{
119 UINT i;
120 FLGCB *flgcb;
121
122 for (flgcb = flgcb_table, i = 0; i < TNUM_FLG; flgcb++, i++) {
123 queue_initialize(&(flgcb->wait_queue));
124 flgcb->flginib = &(flginib_table[i]);
125 flgcb->flgptn = flgcb->flginib->iflgptn;
126 }
127}
128
129#endif /* __flgini */
130
131/*
132 * イベントフラグ待
133ち解除条件のチェック
134 */
135#ifdef __flgcnd
136
137BOOL
138eventflag_cond(FLGCB *flgcb, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
139{
140 if ((wfmode & TWF_ORW) != 0 ? (flgcb->flgptn & waiptn) != 0
141 : (flgcb->flgptn & waiptn) == waiptn) {
142 *p_flgptn = flgcb->flgptn;
143 if ((flgcb->flginib->flgatr & TA_CLR) != 0) {
144 flgcb->flgptn = 0;
145 }
146 return(TRUE);
147 }
148 return(FALSE);
149}
150
151#endif /* __flgcnd */
152
153/*
154 * イベントフラグのセット
155 */
156#ifdef __set_flg
157
158SYSCALL ER
159set_flg(ID flgid, FLGPTN setptn)
160{
161 FLGCB *flgcb;
162 TCB *tcb;
163 WINFO_FLG *winfo;
164 ER ercd;
165
166 LOG_SET_FLG_ENTER(flgid, setptn);
167 CHECK_TSKCTX_UNL();
168 CHECK_FLGID(flgid);
169 flgcb = get_flgcb(flgid);
170
171 t_lock_cpu();
172 flgcb->flgptn |= setptn;
173 if (!(queue_empty(&(flgcb->wait_queue)))) {
174 tcb = (TCB *)(flgcb->wait_queue.next);
175 winfo = (WINFO_FLG *)(tcb->winfo);
176 if (eventflag_cond(flgcb, winfo->waiptn,
177 winfo->wfmode, &(winfo->flgptn))) {
178 queue_delete(&(tcb->task_queue));
179 if (wait_complete(tcb)) {
180 dispatch();
181 }
182 }
183 }
184 ercd = E_OK;
185 t_unlock_cpu();
186
187 exit:
188 LOG_SET_FLG_LEAVE(ercd);
189 return(ercd);
190}
191
192#endif /* __set_flg */
193
194/*
195 * イベントフラグのセット(非タスクコンテキスト用)
196 */
197#ifdef __iset_flg
198
199SYSCALL ER
200iset_flg(ID flgid, FLGPTN setptn)
201{
202 FLGCB *flgcb;
203 TCB *tcb;
204 WINFO_FLG *winfo;
205 ER ercd;
206
207 LOG_ISET_FLG_ENTER(flgid, setptn);
208 CHECK_INTCTX_UNL();
209 CHECK_FLGID(flgid);
210 flgcb = get_flgcb(flgid);
211
212 i_lock_cpu();
213 flgcb->flgptn |= setptn;
214 if (!(queue_empty(&(flgcb->wait_queue)))) {
215 tcb = (TCB *)(flgcb->wait_queue.next);
216 winfo = (WINFO_FLG *)(tcb->winfo);
217 if (eventflag_cond(flgcb, winfo->waiptn,
218 winfo->wfmode, &(winfo->flgptn))) {
219 queue_delete(&(tcb->task_queue));
220 if (wait_complete(tcb)) {
221 reqflg = TRUE;
222 }
223 }
224 }
225 ercd = E_OK;
226 i_unlock_cpu();
227
228 exit:
229 LOG_ISET_FLG_LEAVE(ercd);
230 return(ercd);
231}
232
233#endif /* __iset_flg */
234
235/*
236 * イベントフラグのクリア
237 */
238#ifdef __clr_flg
239
240SYSCALL ER
241clr_flg(ID flgid, FLGPTN clrptn)
242{
243 FLGCB *flgcb;
244 ER ercd;
245
246 LOG_CLR_FLG_ENTER(flgid, clrptn);
247 CHECK_TSKCTX_UNL();
248 CHECK_FLGID(flgid);
249 flgcb = get_flgcb(flgid);
250
251 t_lock_cpu();
252 flgcb->flgptn &= clrptn;
253 ercd = E_OK;
254 t_unlock_cpu();
255
256 exit:
257 LOG_CLR_FLG_LEAVE(ercd);
258 return(ercd);
259}
260
261#endif /* __clr_flg */
262
263/*
264 * イベントフラグ待
265ち
266 */
267#ifdef __wai_flg
268
269SYSCALL ER
270wai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
271{
272 FLGCB *flgcb;
273 WINFO_FLG winfo;
274 ER ercd;
275
276 LOG_WAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn);
277 CHECK_DISPATCH();
278 CHECK_FLGID(flgid);
279 CHECK_PAR(waiptn != 0);
280 CHECK_PAR((wfmode & ~TWF_ORW) == 0);
281 flgcb = get_flgcb(flgid);
282
283 t_lock_cpu();
284 if (!(queue_empty(&(flgcb->wait_queue)))) {
285 ercd = E_ILUSE;
286 }
287 else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) {
288 ercd = E_OK;
289 }
290 else {
291 winfo.waiptn = waiptn;
292 winfo.wfmode = wfmode;
293 wobj_make_wait((WOBJCB *) flgcb, (WINFO_WOBJ *) &winfo);
294 dispatch();
295 ercd = winfo.winfo.wercd;
296 if (ercd == E_OK) {
297 *p_flgptn = winfo.flgptn;
298 }
299 }
300 t_unlock_cpu();
301
302 exit:
303 LOG_WAI_FLG_LEAVE(ercd, *p_flgptn);
304 return(ercd);
305}
306
307#endif /* __wai_flg */
308
309/*
310 * イベントフラグ待
311ち(ポーリング)
312 */
313#ifdef __pol_flg
314
315SYSCALL ER
316pol_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn)
317{
318 FLGCB *flgcb;
319 ER ercd;
320
321 LOG_POL_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn);
322 CHECK_TSKCTX_UNL();
323 CHECK_FLGID(flgid);
324 CHECK_PAR(waiptn != 0);
325 CHECK_PAR((wfmode & ~TWF_ORW) == 0);
326 flgcb = get_flgcb(flgid);
327
328 t_lock_cpu();
329 if (!(queue_empty(&(flgcb->wait_queue)))) {
330 ercd = E_ILUSE;
331 }
332 else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) {
333 ercd = E_OK;
334 }
335 else {
336 ercd = E_TMOUT;
337 }
338 t_unlock_cpu();
339
340 exit:
341 LOG_POL_FLG_LEAVE(ercd, *p_flgptn);
342 return(ercd);
343}
344
345#endif /* __pol_flg */
346
347/*
348 * イベントフラグ待
349ち(タイムアウトあり)
350 */
351#ifdef __twai_flg
352
353SYSCALL ER
354twai_flg(ID flgid, FLGPTN waiptn, MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
355{
356 FLGCB *flgcb;
357 WINFO_FLG winfo;
358 TMEVTB tmevtb;
359 ER ercd;
360
361 LOG_TWAI_FLG_ENTER(flgid, waiptn, wfmode, p_flgptn, tmout);
362 CHECK_DISPATCH();
363 CHECK_FLGID(flgid);
364 CHECK_PAR(waiptn != 0);
365 CHECK_PAR((wfmode & ~TWF_ORW) == 0);
366 CHECK_TMOUT(tmout);
367 flgcb = get_flgcb(flgid);
368
369 t_lock_cpu();
370 if (!(queue_empty(&(flgcb->wait_queue)))) {
371 ercd = E_ILUSE;
372 }
373 else if (eventflag_cond(flgcb, waiptn, wfmode, p_flgptn)) {
374 ercd = E_OK;
375 }
376 else if (tmout == TMO_POL) {
377 ercd = E_TMOUT;
378 }
379 else {
380 winfo.waiptn = waiptn;
381 winfo.wfmode = wfmode;
382 wobj_make_wait_tmout((WOBJCB *) flgcb, (WINFO_WOBJ *) &winfo,
383 &tmevtb, tmout);
384 dispatch();
385 ercd = winfo.winfo.wercd;
386 if (ercd == E_OK) {
387 *p_flgptn = winfo.flgptn;
388 }
389 }
390 t_unlock_cpu();
391
392 exit:
393 LOG_TWAI_FLG_LEAVE(ercd, *p_flgptn);
394 return(ercd);
395}
396
397#endif /* __twai_flg */
Note: See TracBrowser for help on using the repository browser.