#include "kernel_impl.h"
#include "check.h"
#include "task.h"
#include "wait.h"
#include "mempfix.h"
マクロ定義 | |
#define | LOG_GET_MPF_ENTER(mpfid, p_blk) |
#define | LOG_GET_MPF_LEAVE(ercd, blk) |
#define | LOG_PGET_MPF_ENTER(mpfid, p_blk) |
#define | LOG_PGET_MPF_LEAVE(ercd, blk) |
#define | LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout) |
#define | LOG_TGET_MPF_LEAVE(ercd, blk) |
#define | LOG_REL_MPF_ENTER(mpfid, blk) |
#define | LOG_REL_MPF_LEAVE(ercd) |
#define | LOG_INI_MPF_ENTER(mpfid) |
#define | LOG_INI_MPF_LEAVE(ercd) |
#define | LOG_REF_MPF_ENTER(mpfid, pk_rmpf) |
#define | LOG_REF_MPF_LEAVE(ercd, pk_rmpf) |
#define | tnum_mpf ((uint_t)(tmax_mpfid - TMIN_MPFID + 1)) |
#define | INDEX_MPF(mpfid) ((uint_t)((mpfid) - TMIN_MPFID)) |
#define | get_mpfcb(mpfid) (&(mpfcb_table[INDEX_MPF(mpfid)])) |
#define | INDEX_NULL (~0U) |
#define | INDEX_ALLOC (~1U) |
関数 | |
void | initialize_mempfix (void) |
void | get_mpf_block (MPFCB *p_mpfcb, void **p_blk) |
ER | get_mpf (ID mpfid, void **p_blk) |
ER | pget_mpf (ID mpfid, void **p_blk) |
ER | tget_mpf (ID mpfid, void **p_blk, TMO tmout) |
ER | rel_mpf (ID mpfid, void *blk) |
ER | ini_mpf (ID mpfid) |
ER | ref_mpf (ID mpfid, T_RMPF *pk_rmpf) |
#define get_mpfcb | ( | mpfid | ) | (&(mpfcb_table[INDEX_MPF(mpfid)])) |
参照元 get_mpf(), ini_mpf(), pget_mpf(), ref_mpf(), rel_mpf(), と tget_mpf().
#define INDEX_ALLOC (~1U) |
#define INDEX_NULL (~0U) |
#define LOG_PGET_MPF_ENTER | ( | mpfid, | |||
p_blk | ) |
#define LOG_PGET_MPF_LEAVE | ( | ercd, | |||
blk | ) |
#define LOG_TGET_MPF_ENTER | ( | mpfid, | |||
p_blk, | |||||
tmout | ) |
#define LOG_TGET_MPF_LEAVE | ( | ercd, | |||
blk | ) |
#define tnum_mpf ((uint_t)(tmax_mpfid - TMIN_MPFID + 1)) |
参照先 CHECK_DISPATCH, CHECK_MPFID, dispatch, E_OK, fixed_memorypool_control_block::fblkcnt, get_mpf_block(), get_mpfcb, LOG_GET_MPF_ENTER, LOG_GET_MPF_LEAVE, p_runtsk, t_lock_cpu, t_unlock_cpu, TS_WAIT_MPF, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait.
00177 { 00178 MPFCB *p_mpfcb; 00179 WINFO_MPF winfo_mpf; 00180 ER ercd; 00181 00182 LOG_GET_MPF_ENTER(mpfid, p_blk); 00183 CHECK_DISPATCH(); 00184 CHECK_MPFID(mpfid); 00185 p_mpfcb = get_mpfcb(mpfid); 00186 00187 t_lock_cpu(); 00188 if (p_mpfcb->fblkcnt > 0) { 00189 get_mpf_block(p_mpfcb, p_blk); 00190 ercd = E_OK; 00191 } 00192 else { 00193 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF); 00194 wobj_make_wait((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf); 00195 dispatch(); 00196 ercd = winfo_mpf.winfo.wercd; 00197 if (ercd == E_OK) { 00198 *p_blk = winfo_mpf.blk; 00199 } 00200 } 00201 t_unlock_cpu(); 00202 00203 error_exit: 00204 LOG_GET_MPF_LEAVE(ercd, *p_blk); 00205 return(ercd); 00206 }
void get_mpf_block | ( | MPFCB * | p_mpfcb, | |
void ** | p_blk | |||
) |
参照先 fixed_memorypool_initialization_block::blksz, fixed_memorypool_control_block::fblkcnt, fixed_memorypool_control_block::freelist, INDEX_ALLOC, INDEX_NULL, fixed_memorypool_initialization_block::mpf, fixed_memorypool_control_block::p_mpfinib, fixed_memorypool_initialization_block::p_mpfmb, と fixed_memorypool_control_block::unused.
参照元 get_mpf(), pget_mpf(), と tget_mpf().
00151 { 00152 uint_t blkidx; 00153 00154 if (p_mpfcb->freelist != INDEX_NULL) { 00155 blkidx = p_mpfcb->freelist; 00156 p_mpfcb->freelist = (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next; 00157 } 00158 else { 00159 blkidx = p_mpfcb->unused; 00160 p_mpfcb->unused++; 00161 } 00162 *p_blk = (void *)((char *)(p_mpfcb->p_mpfinib->mpf) 00163 + p_mpfcb->p_mpfinib->blksz * blkidx); 00164 p_mpfcb->fblkcnt--; 00165 (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = INDEX_ALLOC; 00166 }
参照先 fixed_memorypool_initialization_block::blkcnt, CHECK_MPFID, CHECK_TSKCTX_UNL, dispatch, E_OK, fixed_memorypool_control_block::fblkcnt, fixed_memorypool_control_block::freelist, get_mpfcb, INDEX_NULL, init_wait_queue, LOG_INI_MPF_ENTER, LOG_INI_MPF_LEAVE, fixed_memorypool_control_block::p_mpfinib, t_lock_cpu, t_unlock_cpu, fixed_memorypool_control_block::unused, と fixed_memorypool_control_block::wait_queue.
00345 { 00346 MPFCB *p_mpfcb; 00347 bool_t dspreq; 00348 ER ercd; 00349 00350 LOG_INI_MPF_ENTER(mpfid); 00351 CHECK_TSKCTX_UNL(); 00352 CHECK_MPFID(mpfid); 00353 p_mpfcb = get_mpfcb(mpfid); 00354 00355 t_lock_cpu(); 00356 dspreq = init_wait_queue(&(p_mpfcb->wait_queue)); 00357 p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt; 00358 p_mpfcb->unused = 0U; 00359 p_mpfcb->freelist = INDEX_NULL; 00360 if (dspreq) { 00361 dispatch(); 00362 } 00363 ercd = E_OK; 00364 t_unlock_cpu(); 00365 00366 error_exit: 00367 LOG_INI_MPF_LEAVE(ercd); 00368 return(ercd); 00369 }
void initialize_mempfix | ( | void | ) |
参照先 fixed_memorypool_initialization_block::blkcnt, fixed_memorypool_control_block::fblkcnt, fixed_memorypool_control_block::freelist, INDEX_NULL, mpfcb_table, mpfinib_table, fixed_memorypool_control_block::p_mpfinib, queue_initialize(), tnum_mpf, fixed_memorypool_control_block::unused, と fixed_memorypool_control_block::wait_queue.
00129 { 00130 uint_t i; 00131 MPFCB *p_mpfcb; 00132 00133 for (p_mpfcb = mpfcb_table, i = 0; i < tnum_mpf; p_mpfcb++, i++) { 00134 queue_initialize(&(p_mpfcb->wait_queue)); 00135 p_mpfcb->p_mpfinib = &(mpfinib_table[i]); 00136 p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt; 00137 p_mpfcb->unused = 0U; 00138 p_mpfcb->freelist = INDEX_NULL; 00139 } 00140 }
参照先 CHECK_MPFID, CHECK_TSKCTX_UNL, E_OK, E_TMOUT, fixed_memorypool_control_block::fblkcnt, get_mpf_block(), get_mpfcb, LOG_PGET_MPF_ENTER, LOG_PGET_MPF_LEAVE, t_lock_cpu, と t_unlock_cpu.
00217 { 00218 MPFCB *p_mpfcb; 00219 ER ercd; 00220 00221 LOG_PGET_MPF_ENTER(mpfid, p_blk); 00222 CHECK_TSKCTX_UNL(); 00223 CHECK_MPFID(mpfid); 00224 p_mpfcb = get_mpfcb(mpfid); 00225 00226 t_lock_cpu(); 00227 if (p_mpfcb->fblkcnt > 0) { 00228 get_mpf_block(p_mpfcb, p_blk); 00229 ercd = E_OK; 00230 } 00231 else { 00232 ercd = E_TMOUT; 00233 } 00234 t_unlock_cpu(); 00235 00236 error_exit: 00237 LOG_PGET_MPF_LEAVE(ercd, *p_blk); 00238 return(ercd); 00239 }
参照先 CHECK_MPFID, CHECK_TSKCTX_UNL, E_OK, fixed_memorypool_control_block::fblkcnt, t_rmpf::fblkcnt, get_mpfcb, LOG_REF_MPF_ENTER, LOG_REF_MPF_LEAVE, t_lock_cpu, t_unlock_cpu, fixed_memorypool_control_block::wait_queue, wait_tskid(), と t_rmpf::wtskid.
00380 { 00381 MPFCB *p_mpfcb; 00382 ER ercd; 00383 00384 LOG_REF_MPF_ENTER(mpfid, pk_rmpf); 00385 CHECK_TSKCTX_UNL(); 00386 CHECK_MPFID(mpfid); 00387 p_mpfcb = get_mpfcb(mpfid); 00388 00389 t_lock_cpu(); 00390 pk_rmpf->wtskid = wait_tskid(&(p_mpfcb->wait_queue)); 00391 pk_rmpf->fblkcnt = p_mpfcb->fblkcnt; 00392 ercd = E_OK; 00393 t_unlock_cpu(); 00394 00395 error_exit: 00396 LOG_REF_MPF_LEAVE(ercd, pk_rmpf); 00397 return(ercd); 00398 }
参照先 fixed_memorypool_initialization_block::blksz, CHECK_MPFID, CHECK_PAR, CHECK_TSKCTX_UNL, dispatch, E_OK, fixed_memorypool_control_block::fblkcnt, fixed_memorypool_control_block::freelist, get_mpfcb, INDEX_ALLOC, LOG_REL_MPF_ENTER, LOG_REL_MPF_LEAVE, fixed_memorypool_initialization_block::mpf, fixed_memorypool_control_block::p_mpfinib, fixed_memorypool_initialization_block::p_mpfmb, task_control_block::p_winfo, queue_delete_next(), queue_empty(), t_lock_cpu, t_unlock_cpu, fixed_memorypool_control_block::unused, wait_complete, と fixed_memorypool_control_block::wait_queue.
00296 { 00297 MPFCB *p_mpfcb; 00298 SIZE blkoffset; 00299 uint_t blkidx; 00300 TCB *p_tcb; 00301 ER ercd; 00302 00303 LOG_REL_MPF_ENTER(mpfid, blk); 00304 CHECK_TSKCTX_UNL(); 00305 CHECK_MPFID(mpfid); 00306 p_mpfcb = get_mpfcb(mpfid); 00307 CHECK_PAR(p_mpfcb->p_mpfinib->mpf <= blk); 00308 blkoffset = ((char *) blk) - (char *)(p_mpfcb->p_mpfinib->mpf); 00309 CHECK_PAR(blkoffset % p_mpfcb->p_mpfinib->blksz == 0U); 00310 CHECK_PAR(blkoffset / p_mpfcb->p_mpfinib->blksz < p_mpfcb->unused); 00311 blkidx = (uint_t)(blkoffset / p_mpfcb->p_mpfinib->blksz); 00312 CHECK_PAR((p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next == INDEX_ALLOC); 00313 00314 t_lock_cpu(); 00315 if (!queue_empty(&(p_mpfcb->wait_queue))) { 00316 p_tcb = (TCB *) queue_delete_next(&(p_mpfcb->wait_queue)); 00317 ((WINFO_MPF *)(p_tcb->p_winfo))->blk = blk; 00318 if (wait_complete(p_tcb)) { 00319 dispatch(); 00320 } 00321 ercd = E_OK; 00322 } 00323 else { 00324 p_mpfcb->fblkcnt++; 00325 (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = p_mpfcb->freelist; 00326 p_mpfcb->freelist = blkidx; 00327 ercd = E_OK; 00328 } 00329 t_unlock_cpu(); 00330 00331 error_exit: 00332 LOG_REL_MPF_LEAVE(ercd); 00333 return(ercd); 00334 }
参照先 CHECK_DISPATCH, CHECK_MPFID, CHECK_TMOUT, dispatch, E_OK, E_TMOUT, fixed_memorypool_control_block::fblkcnt, get_mpf_block(), get_mpfcb, LOG_TGET_MPF_ENTER, LOG_TGET_MPF_LEAVE, p_runtsk, t_lock_cpu, t_unlock_cpu, TMO_POL, TS_WAIT_MPF, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait_tmout.
00250 { 00251 MPFCB *p_mpfcb; 00252 WINFO_MPF winfo_mpf; 00253 TMEVTB tmevtb; 00254 ER ercd; 00255 00256 LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout); 00257 CHECK_DISPATCH(); 00258 CHECK_MPFID(mpfid); 00259 CHECK_TMOUT(tmout); 00260 p_mpfcb = get_mpfcb(mpfid); 00261 00262 t_lock_cpu(); 00263 if (p_mpfcb->fblkcnt > 0) { 00264 get_mpf_block(p_mpfcb, p_blk); 00265 ercd = E_OK; 00266 } 00267 else if (tmout == TMO_POL) { 00268 ercd = E_TMOUT; 00269 } 00270 else { 00271 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF); 00272 wobj_make_wait_tmout((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf, 00273 &tmevtb, tmout); 00274 dispatch(); 00275 ercd = winfo_mpf.winfo.wercd; 00276 if (ercd == E_OK) { 00277 *p_blk = winfo_mpf.blk; 00278 } 00279 } 00280 t_unlock_cpu(); 00281 00282 error_exit: 00283 LOG_TGET_MPF_LEAVE(ercd, *p_blk); 00284 return(ercd); 00285 }
Copyright © 2008 by Kijineko Inc.