source: asp_ewarm/asp-1.7.0/kernel/semaphore.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.5 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
12 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
13 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
14 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
15 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
16 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
17 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
18 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
19ƒƒ“ƒgi—˜—p
20 * ŽÒƒ}ƒjƒ…
21ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
22 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
23 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
24 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
25 * ‚ƁD
26 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
27ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
28ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
29 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
30 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
31 * •ñ‚·‚邱‚ƁD
32 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
33 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
34 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
35 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
36 * –Ɛӂ·‚邱‚ƁD
37 *
38 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
39 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
40 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
41 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
42 * ‚̐ӔC‚𕉂í‚È‚¢D
43 *
44 * @(#) $Id: semaphore.c 748 2008-03-07 17:18:06Z hiro $
45 */
46
47/*
48 * ƒZƒ}ƒtƒH‹@”\
49 */
50
51#include "kernel_impl.h"
52#include "check.h"
53#include "task.h"
54#include "wait.h"
55#include "semaphore.h"
56
57/*
58 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
59 */
60#ifndef LOG_SIG_SEM_ENTER
61#define LOG_SIG_SEM_ENTER(semid)
62#endif /* LOG_SIG_SEM_ENTER */
63
64#ifndef LOG_SIG_SEM_LEAVE
65#define LOG_SIG_SEM_LEAVE(ercd)
66#endif /* LOG_SIG_SEM_LEAVE */
67
68#ifndef LOG_ISIG_SEM_ENTER
69#define LOG_ISIG_SEM_ENTER(semid)
70#endif /* LOG_ISIG_SEM_ENTER */
71
72#ifndef LOG_ISIG_SEM_LEAVE
73#define LOG_ISIG_SEM_LEAVE(ercd)
74#endif /* LOG_ISIG_SEM_LEAVE */
75
76#ifndef LOG_WAI_SEM_ENTER
77#define LOG_WAI_SEM_ENTER(semid)
78#endif /* LOG_WAI_SEM_ENTER */
79
80#ifndef LOG_WAI_SEM_LEAVE
81#define LOG_WAI_SEM_LEAVE(ercd)
82#endif /* LOG_WAI_SEM_LEAVE */
83
84#ifndef LOG_POL_SEM_ENTER
85#define LOG_POL_SEM_ENTER(semid)
86#endif /* LOG_POL_SEM_ENTER */
87
88#ifndef LOG_POL_SEM_LEAVE
89#define LOG_POL_SEM_LEAVE(ercd)
90#endif /* LOG_POL_SEM_LEAVE */
91
92#ifndef LOG_TWAI_SEM_ENTER
93#define LOG_TWAI_SEM_ENTER(semid, tmout)
94#endif /* LOG_TWAI_SEM_ENTER */
95
96#ifndef LOG_TWAI_SEM_LEAVE
97#define LOG_TWAI_SEM_LEAVE(ercd)
98#endif /* LOG_TWAI_SEM_LEAVE */
99
100#ifndef LOG_INI_SEM_ENTER
101#define LOG_INI_SEM_ENTER(semid)
102#endif /* LOG_INI_SEM_ENTER */
103
104#ifndef LOG_INI_SEM_LEAVE
105#define LOG_INI_SEM_LEAVE(ercd)
106#endif /* LOG_INI_SEM_LEAVE */
107
108#ifndef LOG_REF_SEM_ENTER
109#define LOG_REF_SEM_ENTER(semid, pk_rsem)
110#endif /* LOG_REF_SEM_ENTER */
111
112#ifndef LOG_REF_SEM_LEAVE
113#define LOG_REF_SEM_LEAVE(ercd, pk_rsem)
114#endif /* LOG_REF_SEM_LEAVE */
115
116/*
117 * ƒZƒ}ƒtƒH‚̐”
118 */
119#define tnum_sem ((uint_t)(tmax_semid - TMIN_SEMID + 1))
120
121/*
122 * ƒZƒ}ƒtƒHID‚©‚çƒZƒ}ƒtƒHŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
123 */
124#define INDEX_SEM(semid) ((uint_t)((semid) - TMIN_SEMID))
125#define get_semcb(semid) (&(semcb_table[INDEX_SEM(semid)]))
126
127/*
128 * ƒZƒ}ƒtƒH‹@”\‚̏‰Šú‰»
129 */
130#ifdef TOPPERS_semini
131
132void
133initialize_semaphore(void)
134{
135 uint_t i;
136 SEMCB *p_semcb;
137
138 for (p_semcb = semcb_table, i = 0; i < tnum_sem; p_semcb++, i++) {
139 queue_initialize(&(p_semcb->wait_queue));
140 p_semcb->p_seminib = &(seminib_table[i]);
141 p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
142 }
143}
144
145#endif /* TOPPERS_semini */
146
147/*
148 * ƒZƒ}ƒtƒHŽ‘Œ¹‚Ì•Ô‹p
149 */
150#ifdef TOPPERS_sig_sem
151
152ER
153sig_sem(ID semid)
154{
155 SEMCB *p_semcb;
156 TCB *p_tcb;
157 ER ercd;
158
159 LOG_SIG_SEM_ENTER(semid);
160 CHECK_TSKCTX_UNL();
161 CHECK_SEMID(semid);
162 p_semcb = get_semcb(semid);
163
164 t_lock_cpu();
165 if (!queue_empty(&(p_semcb->wait_queue))) {
166 p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue));
167 if (wait_complete(p_tcb)) {
168 dispatch();
169 }
170 ercd = E_OK;
171 }
172 else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) {
173 p_semcb->semcnt += 1;
174 ercd = E_OK;
175 }
176 else {
177 ercd = E_QOVR;
178 }
179 t_unlock_cpu();
180
181 error_exit:
182 LOG_SIG_SEM_LEAVE(ercd);
183 return(ercd);
184}
185
186#endif /* TOPPERS_sig_sem */
187
188/*
189 * ƒZƒ}ƒtƒHŽ‘Œ¹‚Ì•Ô‹pi”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
190 */
191#ifdef TOPPERS_isig_sem
192
193ER
194isig_sem(ID semid)
195{
196 SEMCB *p_semcb;
197 TCB *p_tcb;
198 ER ercd;
199
200 LOG_ISIG_SEM_ENTER(semid);
201 CHECK_INTCTX_UNL();
202 CHECK_SEMID(semid);
203 p_semcb = get_semcb(semid);
204
205 i_lock_cpu();
206 if (!queue_empty(&(p_semcb->wait_queue))) {
207 p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue));
208 if (wait_complete(p_tcb)) {
209 reqflg = true;
210 }
211 ercd = E_OK;
212 }
213 else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) {
214 p_semcb->semcnt += 1;
215 ercd = E_OK;
216 }
217 else {
218 ercd = E_QOVR;
219 }
220 i_unlock_cpu();
221
222 error_exit:
223 LOG_ISIG_SEM_LEAVE(ercd);
224 return(ercd);
225}
226
227#endif /* TOPPERS_isig_sem */
228
229/*
230 * ƒZƒ}ƒtƒHŽ‘Œ¹‚ÌŠl“¾
231 */
232#ifdef TOPPERS_wai_sem
233
234ER
235wai_sem(ID semid)
236{
237 SEMCB *p_semcb;
238 WINFO_SEM winfo_sem;
239 ER ercd;
240
241 LOG_WAI_SEM_ENTER(semid);
242 CHECK_DISPATCH();
243 CHECK_SEMID(semid);
244 p_semcb = get_semcb(semid);
245
246 t_lock_cpu();
247 if (p_semcb->semcnt >= 1) {
248 p_semcb->semcnt -= 1;
249 ercd = E_OK;
250 }
251 else {
252 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SEM);
253 wobj_make_wait((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem);
254 dispatch();
255 ercd = winfo_sem.winfo.wercd;
256 }
257 t_unlock_cpu();
258
259 error_exit:
260 LOG_WAI_SEM_LEAVE(ercd);
261 return(ercd);
262}
263
264#endif /* TOPPERS_wai_sem */
265
266/*
267 * ƒZƒ}ƒtƒHŽ‘Œ¹‚ÌŠl“¾iƒ|[ƒŠƒ“ƒOj
268 */
269#ifdef TOPPERS_pol_sem
270
271ER
272pol_sem(ID semid)
273{
274 SEMCB *p_semcb;
275 ER ercd;
276
277 LOG_POL_SEM_ENTER(semid);
278 CHECK_TSKCTX_UNL();
279 CHECK_SEMID(semid);
280 p_semcb = get_semcb(semid);
281
282 t_lock_cpu();
283 if (p_semcb->semcnt >= 1) {
284 p_semcb->semcnt -= 1;
285 ercd = E_OK;
286 }
287 else {
288 ercd = E_TMOUT;
289 }
290 t_unlock_cpu();
291
292 error_exit:
293 LOG_POL_SEM_LEAVE(ercd);
294 return(ercd);
295}
296
297#endif /* TOPPERS_pol_sem */
298
299/*
300 * ƒZƒ}ƒtƒHŽ‘Œ¹‚ÌŠl“¾iƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
301 */
302#ifdef TOPPERS_twai_sem
303
304ER
305twai_sem(ID semid, TMO tmout)
306{
307 SEMCB *p_semcb;
308 WINFO_SEM winfo_sem;
309 TMEVTB tmevtb;
310 ER ercd;
311
312 LOG_TWAI_SEM_ENTER(semid, tmout);
313 CHECK_DISPATCH();
314 CHECK_SEMID(semid);
315 CHECK_TMOUT(tmout);
316 p_semcb = get_semcb(semid);
317
318 t_lock_cpu();
319 if (p_semcb->semcnt >= 1) {
320 p_semcb->semcnt -= 1;
321 ercd = E_OK;
322 }
323 else if (tmout == TMO_POL) {
324 ercd = E_TMOUT;
325 }
326 else {
327 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SEM);
328 wobj_make_wait_tmout((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem,
329 &tmevtb, tmout);
330 dispatch();
331 ercd = winfo_sem.winfo.wercd;
332 }
333 t_unlock_cpu();
334
335 error_exit:
336 LOG_TWAI_SEM_LEAVE(ercd);
337 return(ercd);
338}
339
340#endif /* TOPPERS_twai_sem */
341
342/*
343 * ƒZƒ}ƒtƒH‚̍ú‰»
344 */
345#ifdef TOPPERS_ini_sem
346
347ER
348ini_sem(ID semid)
349{
350 SEMCB *p_semcb;
351 bool_t dspreq;
352 ER ercd;
353
354 LOG_INI_SEM_ENTER(semid);
355 CHECK_TSKCTX_UNL();
356 CHECK_SEMID(semid);
357 p_semcb = get_semcb(semid);
358
359 t_lock_cpu();
360 dspreq = init_wait_queue(&(p_semcb->wait_queue));
361 p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
362 if (dspreq) {
363 dispatch();
364 }
365 ercd = E_OK;
366 t_unlock_cpu();
367
368 error_exit:
369 LOG_INI_SEM_LEAVE(ercd);
370 return(ercd);
371}
372
373#endif /* TOPPERS_ini_sem */
374
375/*
376 * ƒZƒ}ƒtƒH‚̏ó‘ÔŽQÆ
377 */
378#ifdef TOPPERS_ref_sem
379
380ER
381ref_sem(ID semid, T_RSEM *pk_rsem)
382{
383 SEMCB *p_semcb;
384 ER ercd;
385
386 LOG_REF_SEM_ENTER(semid, pk_rsem);
387 CHECK_TSKCTX_UNL();
388 CHECK_SEMID(semid);
389 p_semcb = get_semcb(semid);
390
391 t_lock_cpu();
392 pk_rsem->wtskid = wait_tskid(&(p_semcb->wait_queue));
393 pk_rsem->semcnt = p_semcb->semcnt;
394 ercd = E_OK;
395 t_unlock_cpu();
396
397 error_exit:
398 LOG_REF_SEM_LEAVE(ercd, pk_rsem);
399 return(ercd);
400}
401
402#endif /* TOPPERS_ref_sem */
Note: See TracBrowser for help on using the repository browser.