mempfix.c

#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)]))

mempfix.c114 行で定義されています。

参照元 get_mpf(), ini_mpf(), pget_mpf(), ref_mpf(), rel_mpf(), と tget_mpf().

#define INDEX_ALLOC   (~1U)

mempfix.c120 行で定義されています。

参照元 get_mpf_block(), と rel_mpf().

#define INDEX_MPF ( mpfid   )     ((uint_t)((mpfid) - TMIN_MPFID))

mempfix.c113 行で定義されています。

#define INDEX_NULL   (~0U)

mempfix.c119 行で定義されています。

参照元 get_mpf_block(), ini_mpf(), と initialize_mempfix().

#define LOG_GET_MPF_ENTER ( mpfid,
p_blk   ) 

mempfix.c57 行で定義されています。

参照元 get_mpf().

#define LOG_GET_MPF_LEAVE ( ercd,
blk   ) 

mempfix.c61 行で定義されています。

参照元 get_mpf().

#define LOG_INI_MPF_ENTER ( mpfid   ) 

mempfix.c89 行で定義されています。

参照元 ini_mpf().

#define LOG_INI_MPF_LEAVE ( ercd   ) 

mempfix.c93 行で定義されています。

参照元 ini_mpf().

#define LOG_PGET_MPF_ENTER ( mpfid,
p_blk   ) 

mempfix.c65 行で定義されています。

参照元 pget_mpf().

#define LOG_PGET_MPF_LEAVE ( ercd,
blk   ) 

mempfix.c69 行で定義されています。

参照元 pget_mpf().

#define LOG_REF_MPF_ENTER ( mpfid,
pk_rmpf   ) 

mempfix.c97 行で定義されています。

参照元 ref_mpf().

#define LOG_REF_MPF_LEAVE ( ercd,
pk_rmpf   ) 

mempfix.c101 行で定義されています。

参照元 ref_mpf().

#define LOG_REL_MPF_ENTER ( mpfid,
blk   ) 

mempfix.c81 行で定義されています。

参照元 rel_mpf().

#define LOG_REL_MPF_LEAVE ( ercd   ) 

mempfix.c85 行で定義されています。

参照元 rel_mpf().

#define LOG_TGET_MPF_ENTER ( mpfid,
p_blk,
tmout   ) 

mempfix.c73 行で定義されています。

参照元 tget_mpf().

#define LOG_TGET_MPF_LEAVE ( ercd,
blk   ) 

mempfix.c77 行で定義されています。

参照元 tget_mpf().

#define tnum_mpf   ((uint_t)(tmax_mpfid - TMIN_MPFID + 1))

mempfix.c107 行で定義されています。

参照元 initialize_mempfix().


関数

ER get_mpf ( ID  mpfid,
void **  p_blk 
)

mempfix.c176 行で定義されています。

参照先 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 
)

mempfix.c150 行で定義されています。

参照先 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 }

ER ini_mpf ( ID  mpfid  ) 

mempfix.c344 行で定義されています。

参照先 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   ) 

mempfix.c128 行で定義されています。

参照先 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 }

ER pget_mpf ( ID  mpfid,
void **  p_blk 
)

mempfix.c216 行で定義されています。

参照先 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 }

ER ref_mpf ( ID  mpfid,
T_RMPF pk_rmpf 
)

mempfix.c379 行で定義されています。

参照先 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 }

ER rel_mpf ( ID  mpfid,
void *  blk 
)

mempfix.c295 行で定義されています。

参照先 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 }

ER tget_mpf ( ID  mpfid,
void **  p_blk,
TMO  tmout 
)

mempfix.c249 行で定義されています。

参照先 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.

ホームページ制作