source: asp_ewarm/asp-1.7.0/extension/mutex/test/bit_mutex.c@ 61

Last change on this file since 61 was 61, checked in by ertl-honda, 11 years ago

ASP for EWARM のコミット.

File size: 8.3 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * High Reliable system Profile Kernel
5 *
6 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
10 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
11 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
12 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
13 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
14 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
15 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
16 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
17ƒƒ“ƒgi—˜—p
18 * ŽÒƒ}ƒjƒ…
19ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
20 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
21 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
22 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
23 * ‚ƁD
24 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
25ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
26ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
27 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
28 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
29 * •ñ‚·‚邱‚ƁD
30 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
31 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
32 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
33 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
34 * –Ɛӂ·‚邱‚ƁD
35 *
36 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
37 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
38 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
39 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
40 * ‚̐ӔC‚𕉂í‚È‚¢D
41 *
42 * @(#) $Id: bit_mutex.c 762 2008-03-07 23:51:41Z hiro $
43 */
44
45/*
46 * ƒ~ƒ…
47[ƒeƒbƒNƒX‹@”\‚̐®‡«ŒŸ¸
48 */
49
50#include "kernel/kernel_impl.h"
51#include "kernel/task.h"
52#include "kernel/mutex.h"
53
54/*
55 * ƒ~ƒ…
56[ƒeƒbƒNƒXID‚©‚çƒ~ƒ…
57[ƒeƒbƒNƒXŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½‚߂̃}ƒN
58 * ƒimutex.c‚æ‚èj
59 */
60#define INDEX_MTX(mtxid) ((uint_t)((mtxid) - TMIN_MTXID))
61#define get_mtxcb(mtxid) (&(mtxcb_table[INDEX_MTX(mtxid)]))
62
63/*
64 * ƒ~ƒ…
65[ƒeƒbƒNƒXŠÇ—ƒuƒƒbƒN’†‚Ìmutex_queue‚ւ̃|ƒCƒ“ƒ^‚©‚çCƒ~ƒ…
66[ƒeƒb
67 * ƒNƒXŠÇ—ƒuƒƒbƒN‚ւ̃|ƒCƒ“ƒ^‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒimutex.c‚æ‚èj
68 */
69#define MTXCB_QUEUE(p_queue) \
70 ((MTXCB *)(((char *) p_queue) - offsetof(MTXCB, mutex_queue)))
71
72/*
73 * ƒ~ƒ…
74[ƒeƒbƒNƒX‚̃vƒƒgƒRƒ‹‚ð”»’f‚·‚éƒ}ƒNƒimutex.c‚æ‚èj
75 */
76#define MTXPROTO_MASK 0x03U
77#define MTXPROTO(p_mtxcb) ((p_mtxcb)->p_mtxinib->mtxatr & MTXPROTO_MASK)
78#define MTX_CEILING(p_mtxcb) (MTXPROTO(p_mtxcb) == TA_CEILING)
79
80/*
81 * ƒGƒ‰[ƒR[ƒh‚Ì’è‹`
82 */
83#define E_SYS_LINENO ERCD(E_SYS, -(__LINE__))
84
85/*
86 * ŠÇ—ƒuƒƒbƒN‚̃AƒhƒŒƒX‚̐³“–«‚̃`ƒFƒbƒN
87 */
88#define VALID_TCB(p_tcb) \
89 ((((char *) p_tcb) - ((char *) tcb_table)) % sizeof(TCB) == 0 \
90 && TMIN_TSKID <= TSKID(p_tcb) && TSKID(p_tcb) <= tmax_tskid)
91
92#define VALID_MTXCB(p_mtxcb) \
93 ((((char *) p_mtxcb) - ((char *) mtxcb_table)) % sizeof(MTXCB) == 0 \
94 && TMIN_MTXID <= MTXID(p_mtxcb) && MTXID(p_mtxcb) <= tmax_mtxid)
95
96/*
97 * ƒLƒ…
98[‚̃`ƒFƒbƒN‚Ì‚½‚߂̊֐”
99 *
100 * p_queue‚Ép_entry‚ªŠÜ‚Ü‚ê‚Ä‚¢‚é‚©‚𒲂ׂéDŠÜ‚Ü‚ê‚Ä‚¢‚ê‚ÎtrueCŠÜ‚Ü
101 * ‚ê‚Ä‚¢‚È‚¢ê‡‚É‚Ífalse‚ð•Ô‚·Dƒ_ƒuƒ‹ƒŠƒ“ƒN‚Ì•s®‡‚̏ꍇ‚É‚àC
102 * false‚ð•Ô‚·D
103 */
104static bool_t
105in_queue(QUEUE *p_queue, QUEUE *p_entry)
106{
107 QUEUE *p_current, *p_next;
108
109 p_current = p_queue->p_next;
110 if (p_current->p_prev != p_queue) {
111 return(false); /* ƒ_ƒuƒ‹ƒŠƒ“ƒN‚Ì•s®‡ */
112 }
113 while (p_current != p_queue) {
114 if (p_current == p_entry) {
115 return(true); /* p_entry‚ªŠÜ‚Ü‚ê‚Ä‚¢‚½ */
116 }
117
118 /*
119 * ƒLƒ…
120[‚ÌŽŸ‚Ì—v‘f‚ɐi‚Þ
121 */
122 p_next = p_current->p_next;
123 if (p_next->p_prev != p_current) {
124 return(false); /* ƒ_ƒuƒ‹ƒŠƒ“ƒN‚Ì•s®‡ */
125 }
126 p_current = p_next;
127 }
128 return(false);
129}
130
131/*
132 * ƒ^ƒXƒN–ˆ‚ÌŒŸ¸
133 */
134static ER
135bit_mutex_task(ID tskid)
136{
137 TCB *p_tcb;
138 MTXCB *p_mtxcb;
139 QUEUE *p_queue, *p_next;
140 uint_t priority;
141
142 if (!(TMIN_TSKID <= (tskid) && (tskid) <= tmax_tskid)) {
143 return(E_ID);
144 }
145 p_tcb = get_tcb(tskid);
146 priority = p_tcb->bpriority;
147
148 /*
149 * ƒ^ƒXƒN‚ªƒƒbƒN‚µ‚Ä‚¢‚éƒ~ƒ…
150[ƒeƒbƒNƒX‚̃Lƒ…
151[‚ÌŒŸ¸
152 */
153 p_queue = p_tcb->mutex_queue.p_next;
154 if (p_queue->p_prev != &(p_tcb->mutex_queue)) {
155 return(E_SYS_LINENO);
156 }
157 while (p_queue != &(p_tcb->mutex_queue)) {
158 p_mtxcb = MTXCB_QUEUE(p_queue);
159 if (!VALID_MTXCB(p_mtxcb)) {
160 return(E_SYS_LINENO);
161 }
162
163 /*
164 * ƒ~ƒ…
165[ƒeƒbƒNƒX‚ðƒƒbƒN‚µ‚Ä‚¢‚éƒ^ƒXƒN‚̃`ƒFƒbƒN
166 */
167 if (p_mtxcb->p_loctsk != p_tcb) {
168 return(E_SYS_LINENO);
169 }
170
171 /*
172 * Œ»Ý—Dæ“x‚ÌŒvŽZ
173 */
174 if (MTXPROTO(p_mtxcb)) {
175 if (p_mtxcb->p_mtxinib->ceilpri < priority) {
176 priority = p_mtxcb->p_mtxinib->ceilpri;
177 }
178 }
179
180 /*
181 * ƒLƒ…
182[‚ÌŽŸ‚Ì—v‘f‚ɐi‚Þ
183 */
184 p_next = p_queue->p_next;
185 if (p_next->p_prev != p_queue) {
186 return(E_SYS_LINENO);
187 }
188 p_queue = p_next;
189 }
190
191 /*
192 * Œ»Ý—Dæ“x‚ÌŒŸ¸
193 */
194 if (p_tcb->priority != p_tcb->priority) {
195 return(E_SYS_LINENO);
196 }
197
198 /*
199 * ƒ^ƒXƒN‚ª‘Ò‚Á‚Ä‚¢‚éƒ~ƒ…
200[ƒeƒbƒNƒX‚ÉŠÖ‚·‚錟¸
201 */
202 if (TSTAT_WAIT_MTX(p_tcb->tstat)) {
203 p_mtxcb = ((WINFO_MTX *)(p_tcb->p_winfo))->p_mtxcb;
204 if (!VALID_MTXCB(p_mtxcb)) {
205 return(E_SYS_LINENO);
206 }
207 if (!in_queue(&(p_mtxcb->wait_queue), &(p_tcb->task_queue))) {
208 return(E_SYS_LINENO);
209 }
210 }
211 return(E_OK);
212}
213
214/*
215 * ƒ~ƒ…
216[ƒeƒbƒNƒX–ˆ‚ÌŒŸ¸
217 */
218static ER
219bit_mutex_mutex(ID mtxid)
220{
221 MTXCB *p_mtxcb;
222 TCB *p_tcb;
223 QUEUE *p_queue, *p_next;
224 uint_t priority;
225
226 if (!(TMIN_MTXID <= (mtxid) && (mtxid) <= tmax_mtxid)) {
227 return(E_ID);
228 }
229 p_mtxcb = get_mtxcb(mtxid);
230
231 /*
232 * ‰Šú‰»ƒuƒƒbƒN‚ւ̃|ƒCƒ“ƒ^‚ÌŒŸ¸
233 */
234 if (p_mtxcb->p_mtxinib != &(mtxinib_table[INDEX_MTX(mtxid)])) {
235 return(E_SYS_LINENO);
236 }
237
238 /*
239 * ƒ~ƒ…
240[ƒeƒbƒNƒX‘Ò‚¿ƒLƒ…
241[‚ÌŒŸ¸
242 */
243 p_queue = p_mtxcb->wait_queue.p_next;
244 if (p_queue->p_prev != &(p_mtxcb->wait_queue)) {
245 return(E_SYS_LINENO);
246 }
247 priority = TMIN_TPRI;
248 while (p_queue != &(p_mtxcb->wait_queue)) {
249 p_tcb = (TCB *) p_queue;
250 if (!VALID_TCB(p_tcb)) {
251 return(E_SYS_LINENO);
252 }
253
254 /*
255 * ƒLƒ…
256[‚ªƒ^ƒXƒN—Dæ“x‡‚É‚È‚Á‚Ä‚¢‚é‚©‚ÌŒŸ¸
257 */
258 if (MTXPROTO(p_mtxcb) != TA_NULL) {
259 if (p_tcb->priority < priority) {
260 return(E_SYS_LINENO);
261 }
262 }
263 priority = p_tcb->priority;
264
265 /*
266 * ƒ^ƒXƒNó‘Ô‚ÌŒŸ¸
267 *
268 * ƒ~ƒ…
269[ƒeƒbƒNƒX‘Ò‚¿ó‘Ԃ̃^ƒXƒN‚ÌŒŸ¸‚́Cƒ^ƒXƒN–ˆ‚ÌŒŸ¸‚ōs‚Á
270 * ‚Ä‚¢‚邽‚߁C‚±‚±‚ł͍s‚í‚È‚¢D
271 */
272 if (!TSTAT_WAIT_MTX(p_tcb->tstat)) {
273 return(E_SYS_LINENO);
274 }
275
276 /*
277 * —Dæ“xãŒÀ‚ÌŒŸ¸
278 */
279 if (MTXPROTO(p_mtxcb) == TA_CEILING) {
280 if (p_tcb->bpriority < p_mtxcb->p_mtxinib->ceilpri) {
281 return(E_SYS_LINENO);
282 }
283 }
284
285 /*
286 * ƒLƒ…
287[‚ÌŽŸ‚Ì—v‘f‚ɐi‚Þ
288 */
289 p_next = p_queue->p_next;
290 if (p_next->p_prev != p_queue) {
291 return(E_SYS_LINENO);
292 }
293 p_queue = p_next;
294 }
295
296 /*
297 * ƒ~ƒ…
298[ƒeƒbƒNƒX‚ðƒƒbƒN‚µ‚Ä‚¢‚éƒ^ƒXƒN‚ÌŒŸ¸
299 */
300 p_tcb = p_mtxcb->p_loctsk;
301 if (p_tcb == NULL) {
302 /*
303 * ƒ~ƒ…
304[ƒeƒbƒNƒX‚ªƒƒbƒN‚³‚ê‚Ä‚¢‚È‚¢Žž
305 */
306 if (!queue_empty(&(p_mtxcb->wait_queue))) {
307 return(E_SYS_LINENO);
308 }
309 }
310 else {
311 /*
312 * ƒ~ƒ…
313[ƒeƒbƒNƒX‚ªƒƒbƒN‚³‚ê‚Ä‚¢‚鎞
314 *
315 * ƒ~ƒ…
316[ƒeƒbƒNƒX‚ðƒƒbƒN‚µ‚Ä‚¢‚éƒ^ƒXƒN‚ÌŒŸ¸‚́Cƒ^ƒXƒN–ˆ‚ÌŒŸ
317 * ¸‚ōs‚Á‚Ä‚¢‚邽‚߁C‚±‚±‚ł͍s‚í‚È‚¢D
318 */
319 if (!VALID_TCB(p_tcb)) {
320 return(E_SYS_LINENO);
321 }
322 if (!in_queue(&(p_tcb->mutex_queue), &(p_mtxcb->mutex_queue))) {
323 return(E_SYS_LINENO);
324 }
325
326 /*
327 * —Dæ“xãŒÀ‚ÌŒŸ¸
328 */
329 if (MTXPROTO(p_mtxcb) == TA_CEILING) {
330 if (p_tcb->bpriority < p_mtxcb->p_mtxinib->ceilpri) {
331 return(E_SYS_LINENO);
332 }
333 }
334 }
335 return(E_OK);
336}
337
338/*
339 * ®‡«ŒŸ¸ƒ‹[ƒ`ƒ“–{‘Ì
340 */
341ER
342bit_mutex(void)
343{
344 ID tskid, mtxid;
345 ER ercd;
346
347 /*
348 * ƒ^ƒXƒN–ˆ‚ÌŒŸ¸
349 */
350 for (tskid = TMIN_TSKID; tskid <= tmax_tskid; tskid++) {
351 ercd = bit_mutex_task(tskid);
352 if (ercd != E_OK) {
353 return(ercd);
354 }
355 }
356
357 /*
358 * ƒ~ƒ…
359[ƒeƒbƒNƒX–ˆ‚ÌŒŸ¸
360 */
361 for (mtxid = TMIN_MTXID; mtxid <= tmax_mtxid; mtxid++) {
362 ercd = bit_mutex_mutex(mtxid);
363 if (ercd != E_OK) {
364 return(ercd);
365 }
366 }
367 return(E_OK);
368}
Note: See TracBrowser for help on using the repository browser.