source: asp_ewarm/asp-1.7.0/extension/dcre/kernel/mempfix.c@ 61

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

ASP for EWARM のコミット.

File size: 12.7 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-2010 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: mempfix.c 1966 2010-11-20 07:23:56Z ertl-hiro $
45 */
46
47/*
48 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‹@”\
49 */
50
51#include "kernel_impl.h"
52#include "check.h"
53#include "task.h"
54#include "wait.h"
55#include "mempfix.h"
56
57/*
58 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
59 */
60#ifndef LOG_ACRE_MPF_ENTER
61#define LOG_ACRE_MPF_ENTER(pk_cmpf)
62#endif /* LOG_ACRE_MPF_ENTER */
63
64#ifndef LOG_ACRE_MPF_LEAVE
65#define LOG_ACRE_MPF_LEAVE(ercd)
66#endif /* LOG_ACRE_MPF_LEAVE */
67
68#ifndef LOG_DEL_MPF_ENTER
69#define LOG_DEL_MPF_ENTER(mpfid)
70#endif /* LOG_DEL_MPF_ENTER */
71
72#ifndef LOG_DEL_MPF_LEAVE
73#define LOG_DEL_MPF_LEAVE(ercd)
74#endif /* LOG_DEL_MPF_LEAVE */
75
76#ifndef LOG_GET_MPF_ENTER
77#define LOG_GET_MPF_ENTER(mpfid, p_blk)
78#endif /* LOG_GET_MPF_ENTER */
79
80#ifndef LOG_GET_MPF_LEAVE
81#define LOG_GET_MPF_LEAVE(ercd, blk)
82#endif /* LOG_GET_MPF_LEAVE */
83
84#ifndef LOG_PGET_MPF_ENTER
85#define LOG_PGET_MPF_ENTER(mpfid, p_blk)
86#endif /* LOG_PGET_MPF_ENTER */
87
88#ifndef LOG_PGET_MPF_LEAVE
89#define LOG_PGET_MPF_LEAVE(ercd, blk)
90#endif /* LOG_PGET_MPF_LEAVE */
91
92#ifndef LOG_TGET_MPF_ENTER
93#define LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout)
94#endif /* LOG_TGET_MPF_ENTER */
95
96#ifndef LOG_TGET_MPF_LEAVE
97#define LOG_TGET_MPF_LEAVE(ercd, blk)
98#endif /* LOG_TGET_MPF_LEAVE */
99
100#ifndef LOG_REL_MPF_ENTER
101#define LOG_REL_MPF_ENTER(mpfid, blk)
102#endif /* LOG_REL_MPF_ENTER */
103
104#ifndef LOG_REL_MPF_LEAVE
105#define LOG_REL_MPF_LEAVE(ercd)
106#endif /* LOG_REL_MPF_LEAVE */
107
108#ifndef LOG_INI_MPF_ENTER
109#define LOG_INI_MPF_ENTER(mpfid)
110#endif /* LOG_INI_MPF_ENTER */
111
112#ifndef LOG_INI_MPF_LEAVE
113#define LOG_INI_MPF_LEAVE(ercd)
114#endif /* LOG_INI_MPF_LEAVE */
115
116#ifndef LOG_REF_MPF_ENTER
117#define LOG_REF_MPF_ENTER(mpfid, pk_rmpf)
118#endif /* LOG_REF_MPF_ENTER */
119
120#ifndef LOG_REF_MPF_LEAVE
121#define LOG_REF_MPF_LEAVE(ercd, pk_rmpf)
122#endif /* LOG_REF_MPF_LEAVE */
123
124/*
125 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚̐”
126 */
127#define tnum_mpf ((uint_t)(tmax_mpfid - TMIN_MPFID + 1))
128#define tnum_smpf ((uint_t)(tmax_smpfid - TMIN_MPFID + 1))
129
130/*
131 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹ID‚©‚çŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹ŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½
132 * ‚߂̃}ƒNƒ
133 */
134#define INDEX_MPF(mpfid) ((uint_t)((mpfid) - TMIN_MPFID))
135#define get_mpfcb(mpfid) (&(mpfcb_table[INDEX_MPF(mpfid)]))
136
137/*
138 * “ÁŽê‚ȃCƒ“ƒfƒbƒNƒX’l‚Ì’è‹`
139 */
140#define INDEX_NULL (~0U) /* ‹ó‚«ƒuƒƒbƒNƒŠƒXƒg‚̍Ōã */
141#define INDEX_ALLOC (~1U) /* Š„“–‚čς݂̃uƒƒbƒN */
142
143#ifdef TOPPERS_mpfini
144
145/*
146 * Žg—p‚µ‚Ä‚¢‚È‚¢ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹ŠÇ—ƒuƒƒbƒN‚̃ŠƒXƒg
147 */
148QUEUE free_mpfcb;
149
150/*
151 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‹@”\‚̏‰Šú‰»
152 */
153void
154initialize_mempfix(void)
155{
156 uint_t i, j;
157 MPFCB *p_mpfcb;
158 MPFINIB *p_mpfinib;
159
160 for (p_mpfcb = mpfcb_table, i = 0; i < tnum_smpf; p_mpfcb++, i++) {
161 queue_initialize(&(p_mpfcb->wait_queue));
162 p_mpfcb->p_mpfinib = &(mpfinib_table[i]);
163 p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
164 p_mpfcb->unused = 0U;
165 p_mpfcb->freelist = INDEX_NULL;
166 }
167 queue_initialize(&free_mpfcb);
168 for (j = 0; i < tnum_mpf; p_mpfcb++, i++, j++) {
169 p_mpfinib = &(ampfinib_table[j]);
170 p_mpfinib->mpfatr = TA_NOEXS;
171 p_mpfcb->p_mpfinib = ((const MPFINIB *) p_mpfinib);
172 queue_insert_prev(&free_mpfcb, &(p_mpfcb->wait_queue));
173 }
174}
175
176#endif /* TOPPERS_mpfini */
177
178/*
179 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚©‚çƒuƒƒbƒN‚ðŠl“¾
180 */
181#ifdef TOPPERS_mpfget
182
183void
184get_mpf_block(MPFCB *p_mpfcb, void **p_blk)
185{
186 uint_t blkidx;
187
188 if (p_mpfcb->freelist != INDEX_NULL) {
189 blkidx = p_mpfcb->freelist;
190 p_mpfcb->freelist = (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next;
191 }
192 else {
193 blkidx = p_mpfcb->unused;
194 p_mpfcb->unused++;
195 }
196 *p_blk = (void *)((char *)(p_mpfcb->p_mpfinib->mpf)
197 + p_mpfcb->p_mpfinib->blksz * blkidx);
198 p_mpfcb->fblkcnt--;
199 (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = INDEX_ALLOC;
200}
201
202#endif /* TOPPERS_mpfget */
203
204/*
205 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚̐¶¬
206 */
207#ifdef TOPPERS_acre_mpf
208
209ER_UINT
210acre_mpf(const T_CMPF *pk_cmpf)
211{
212 MPFCB *p_mpfcb;
213 MPFINIB *p_mpfinib;
214 ATR mpfatr;
215 void *mpf;
216 MPFMB *p_mpfmb;
217 ER ercd;
218
219 LOG_ACRE_MPF_ENTER(pk_cmpf);
220 CHECK_TSKCTX_UNL();
221 CHECK_RSATR(pk_cmpf->mpfatr, TA_TPRI|TA_MPRI);
222 CHECK_PAR(pk_cmpf->blkcnt != 0);
223 CHECK_PAR(pk_cmpf->blksz != 0);
224 CHECK_ALIGN_MPF(pk_cmpf->mpf);
225 CHECK_ALIGN_MB(pk_cmpf->mpfmb);
226 mpfatr = pk_cmpf->mpfatr;
227 mpf = pk_cmpf->mpf;
228 p_mpfmb = pk_cmpf->mpfmb;
229
230 t_lock_cpu();
231 if (queue_empty(&free_mpfcb)) {
232 ercd = E_NOID;
233 }
234 else {
235 if (mpf == NULL) {
236 mpf = kernel_malloc(pk_cmpf->blkcnt * ROUND_MPF_T(pk_cmpf->blksz));
237 mpfatr |= TA_MEMALLOC;
238 }
239 if (mpf == NULL) {
240 ercd = E_NOMEM;
241 }
242 else {
243 if (p_mpfmb == NULL) {
244 p_mpfmb = kernel_malloc(sizeof(MPFMB) * pk_cmpf->blkcnt);
245 mpfatr |= TA_MBALLOC;
246 }
247 if (p_mpfmb == NULL) {
248 if ((mpfatr & TA_MEMALLOC) != 0U) {
249 kernel_free(mpf);
250 }
251 ercd = E_NOMEM;
252 }
253 else {
254 p_mpfcb = ((MPFCB *) queue_delete_next(&free_mpfcb));
255 p_mpfinib = (MPFINIB *)(p_mpfcb->p_mpfinib);
256 p_mpfinib->mpfatr = mpfatr;
257 p_mpfinib->blkcnt = pk_cmpf->blkcnt;
258 p_mpfinib->blksz = ROUND_MPF_T(pk_cmpf->blksz);
259 p_mpfinib->mpf = mpf;
260 p_mpfinib->p_mpfmb = p_mpfmb;
261
262 queue_initialize(&(p_mpfcb->wait_queue));
263 p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
264 p_mpfcb->unused = 0U;
265 p_mpfcb->freelist = INDEX_NULL;
266 ercd = MPFID(p_mpfcb);
267 }
268 }
269 }
270 t_unlock_cpu();
271
272 error_exit:
273 LOG_ACRE_MPF_LEAVE(ercd);
274 return(ercd);
275}
276
277#endif /* TOPPERS_acre_mpf */
278
279/*
280 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚̍폜
281 */
282#ifdef TOPPERS_del_mpf
283
284ER
285del_mpf(ID mpfid)
286{
287 MPFCB *p_mpfcb;
288 MPFINIB *p_mpfinib;
289 bool_t dspreq;
290 ER ercd;
291
292 LOG_DEL_MPF_ENTER(mpfid);
293 CHECK_TSKCTX_UNL();
294 CHECK_MPFID(mpfid);
295 p_mpfcb = get_mpfcb(mpfid);
296
297 t_lock_cpu();
298 if (p_mpfcb->p_mpfinib->mpfatr == TA_NOEXS) {
299 ercd = E_NOEXS;
300 }
301 else if (MPFID(p_mpfcb) > tmax_smpfid) {
302 dspreq = init_wait_queue(&(p_mpfcb->wait_queue));
303 p_mpfinib = (MPFINIB *)(p_mpfcb->p_mpfinib);
304 if ((p_mpfinib->mpfatr & TA_MEMALLOC) != 0U) {
305 kernel_free(p_mpfinib->mpf);
306 }
307 if ((p_mpfinib->mpfatr & TA_MBALLOC) != 0U) {
308 kernel_free(p_mpfinib->p_mpfmb);
309 }
310 p_mpfinib->mpfatr = TA_NOEXS;
311 queue_insert_prev(&free_mpfcb, &(p_mpfcb->wait_queue));
312 if (dspreq) {
313 dispatch();
314 }
315 ercd = E_OK;
316 }
317 else {
318 ercd = E_OBJ;
319 }
320 t_unlock_cpu();
321
322 error_exit:
323 LOG_DEL_MPF_LEAVE(ercd);
324 return(ercd);
325}
326
327#endif /* TOPPERS_del_mpf */
328
329/*
330 * ŒÅ’è’·ƒƒ‚ƒŠƒuƒƒbƒN‚ÌŠl“¾
331 */
332#ifdef TOPPERS_get_mpf
333
334ER
335get_mpf(ID mpfid, void **p_blk)
336{
337 MPFCB *p_mpfcb;
338 WINFO_MPF winfo_mpf;
339 ER ercd;
340
341 LOG_GET_MPF_ENTER(mpfid, p_blk);
342 CHECK_DISPATCH();
343 CHECK_MPFID(mpfid);
344 p_mpfcb = get_mpfcb(mpfid);
345
346 t_lock_cpu();
347 if (p_mpfcb->fblkcnt > 0) {
348 get_mpf_block(p_mpfcb, p_blk);
349 ercd = E_OK;
350 }
351 else {
352 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF);
353 wobj_make_wait((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf);
354 dispatch();
355 ercd = winfo_mpf.winfo.wercd;
356 if (ercd == E_OK) {
357 *p_blk = winfo_mpf.blk;
358 }
359 }
360 t_unlock_cpu();
361
362 error_exit:
363 LOG_GET_MPF_LEAVE(ercd, *p_blk);
364 return(ercd);
365}
366
367#endif /* TOPPERS_get_mpf */
368
369/*
370 * ŒÅ’è’·ƒƒ‚ƒŠƒuƒƒbƒN‚ÌŠl“¾iƒ|[ƒŠƒ“ƒOj
371 */
372#ifdef TOPPERS_pget_mpf
373
374ER
375pget_mpf(ID mpfid, void **p_blk)
376{
377 MPFCB *p_mpfcb;
378 ER ercd;
379
380 LOG_PGET_MPF_ENTER(mpfid, p_blk);
381 CHECK_TSKCTX_UNL();
382 CHECK_MPFID(mpfid);
383 p_mpfcb = get_mpfcb(mpfid);
384
385 t_lock_cpu();
386 if (p_mpfcb->fblkcnt > 0) {
387 get_mpf_block(p_mpfcb, p_blk);
388 ercd = E_OK;
389 }
390 else {
391 ercd = E_TMOUT;
392 }
393 t_unlock_cpu();
394
395 error_exit:
396 LOG_PGET_MPF_LEAVE(ercd, *p_blk);
397 return(ercd);
398}
399
400#endif /* TOPPERS_pget_mpf */
401
402/*
403 * ŒÅ’è’·ƒƒ‚ƒŠƒuƒƒbƒN‚ÌŠl“¾iƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
404 */
405#ifdef TOPPERS_tget_mpf
406
407ER
408tget_mpf(ID mpfid, void **p_blk, TMO tmout)
409{
410 MPFCB *p_mpfcb;
411 WINFO_MPF winfo_mpf;
412 TMEVTB tmevtb;
413 ER ercd;
414
415 LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout);
416 CHECK_DISPATCH();
417 CHECK_MPFID(mpfid);
418 CHECK_TMOUT(tmout);
419 p_mpfcb = get_mpfcb(mpfid);
420
421 t_lock_cpu();
422 if (p_mpfcb->fblkcnt > 0) {
423 get_mpf_block(p_mpfcb, p_blk);
424 ercd = E_OK;
425 }
426 else if (tmout == TMO_POL) {
427 ercd = E_TMOUT;
428 }
429 else {
430 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF);
431 wobj_make_wait_tmout((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf,
432 &tmevtb, tmout);
433 dispatch();
434 ercd = winfo_mpf.winfo.wercd;
435 if (ercd == E_OK) {
436 *p_blk = winfo_mpf.blk;
437 }
438 }
439 t_unlock_cpu();
440
441 error_exit:
442 LOG_TGET_MPF_LEAVE(ercd, *p_blk);
443 return(ercd);
444}
445
446#endif /* TOPPERS_tget_mpf */
447
448/*
449 * ŒÅ’è’·ƒƒ‚ƒŠƒuƒƒbƒN‚Ì•Ô‹p
450 */
451#ifdef TOPPERS_rel_mpf
452
453ER
454rel_mpf(ID mpfid, void *blk)
455{
456 MPFCB *p_mpfcb;
457 SIZE blkoffset;
458 uint_t blkidx;
459 TCB *p_tcb;
460 ER ercd;
461
462 LOG_REL_MPF_ENTER(mpfid, blk);
463 CHECK_TSKCTX_UNL();
464 CHECK_MPFID(mpfid);
465 p_mpfcb = get_mpfcb(mpfid);
466 CHECK_PAR(p_mpfcb->p_mpfinib->mpf <= blk);
467 blkoffset = ((char *) blk) - (char *)(p_mpfcb->p_mpfinib->mpf);
468 CHECK_PAR(blkoffset % p_mpfcb->p_mpfinib->blksz == 0U);
469 CHECK_PAR(blkoffset / p_mpfcb->p_mpfinib->blksz < p_mpfcb->unused);
470 blkidx = (uint_t)(blkoffset / p_mpfcb->p_mpfinib->blksz);
471 CHECK_PAR((p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next == INDEX_ALLOC);
472
473 t_lock_cpu();
474 if (!queue_empty(&(p_mpfcb->wait_queue))) {
475 p_tcb = (TCB *) queue_delete_next(&(p_mpfcb->wait_queue));
476 ((WINFO_MPF *)(p_tcb->p_winfo))->blk = blk;
477 if (wait_complete(p_tcb)) {
478 dispatch();
479 }
480 ercd = E_OK;
481 }
482 else {
483 p_mpfcb->fblkcnt++;
484 (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = p_mpfcb->freelist;
485 p_mpfcb->freelist = blkidx;
486 ercd = E_OK;
487 }
488 t_unlock_cpu();
489
490 error_exit:
491 LOG_REL_MPF_LEAVE(ercd);
492 return(ercd);
493}
494
495#endif /* TOPPERS_rel_mpf */
496
497/*
498 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚̍ú‰»
499 */
500#ifdef TOPPERS_ini_mpf
501
502ER
503ini_mpf(ID mpfid)
504{
505 MPFCB *p_mpfcb;
506 bool_t dspreq;
507 ER ercd;
508
509 LOG_INI_MPF_ENTER(mpfid);
510 CHECK_TSKCTX_UNL();
511 CHECK_MPFID(mpfid);
512 p_mpfcb = get_mpfcb(mpfid);
513
514 t_lock_cpu();
515 dspreq = init_wait_queue(&(p_mpfcb->wait_queue));
516 p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
517 p_mpfcb->unused = 0U;
518 p_mpfcb->freelist = INDEX_NULL;
519 if (dspreq) {
520 dispatch();
521 }
522 ercd = E_OK;
523 t_unlock_cpu();
524
525 error_exit:
526 LOG_INI_MPF_LEAVE(ercd);
527 return(ercd);
528}
529
530#endif /* TOPPERS_ini_mpf */
531
532/*
533 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚̏ó‘ÔŽQÆ
534 */
535#ifdef TOPPERS_ref_mpf
536
537ER
538ref_mpf(ID mpfid, T_RMPF *pk_rmpf)
539{
540 MPFCB *p_mpfcb;
541 ER ercd;
542
543 LOG_REF_MPF_ENTER(mpfid, pk_rmpf);
544 CHECK_TSKCTX_UNL();
545 CHECK_MPFID(mpfid);
546 p_mpfcb = get_mpfcb(mpfid);
547
548 t_lock_cpu();
549 pk_rmpf->wtskid = wait_tskid(&(p_mpfcb->wait_queue));
550 pk_rmpf->fblkcnt = p_mpfcb->fblkcnt;
551 ercd = E_OK;
552 t_unlock_cpu();
553
554 error_exit:
555 LOG_REF_MPF_LEAVE(ercd, pk_rmpf);
556 return(ercd);
557}
558
559#endif /* TOPPERS_ref_mpf */
Note: See TracBrowser for help on using the repository browser.