mailbox.c

#include "kernel_impl.h"
#include "check.h"
#include "task.h"
#include "wait.h"
#include "mailbox.h"

ソースコードを見る。

マクロ定義

#define LOG_SND_MBX_ENTER(mbxid, pk_msg)
#define LOG_SND_MBX_LEAVE(ercd)
#define LOG_RCV_MBX_ENTER(mbxid, ppk_msg)
#define LOG_RCV_MBX_LEAVE(ercd, pk_msg)
#define LOG_PRCV_MBX_ENTER(mbxid, ppk_msg)
#define LOG_PRCV_MBX_LEAVE(ercd, pk_msg)
#define LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout)
#define LOG_TRCV_MBX_LEAVE(ercd, pk_msg)
#define LOG_INI_MBX_ENTER(mbxid)
#define LOG_INI_MBX_LEAVE(ercd)
#define LOG_REF_MBX_ENTER(mbxid, pk_rmbx)
#define LOG_REF_MBX_LEAVE(ercd, pk_rmbx)
#define tnum_mbx   ((uint_t)(tmax_mbxid - TMIN_MBXID + 1))
#define INDEX_MBX(mbxid)   ((uint_t)((mbxid) - TMIN_MBXID))
#define get_mbxcb(mbxid)   (&(mbxcb_table[INDEX_MBX(mbxid)]))
#define MSGPRI(pk_msg)   (((T_MSG_PRI *) pk_msg)->msgpri)

関数

void initialize_mailbox (void)
Inline void enqueue_msg_pri (T_MSG **ppk_prevmsg_next, T_MSG *pk_msg)
ER snd_mbx (ID mbxid, T_MSG *pk_msg)
ER rcv_mbx (ID mbxid, T_MSG **ppk_msg)
ER prcv_mbx (ID mbxid, T_MSG **ppk_msg)
ER trcv_mbx (ID mbxid, T_MSG **ppk_msg, TMO tmout)
ER ini_mbx (ID mbxid)
ER ref_mbx (ID mbxid, T_RMBX *pk_rmbx)


マクロ定義

#define get_mbxcb ( mbxid   )     (&(mbxcb_table[INDEX_MBX(mbxid)]))

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

参照元 ini_mbx(), prcv_mbx(), rcv_mbx(), ref_mbx(), snd_mbx(), と trcv_mbx().

#define INDEX_MBX ( mbxid   )     ((uint_t)((mbxid) - TMIN_MBXID))

mailbox.c112 行で定義されています。

#define LOG_INI_MBX_ENTER ( mbxid   ) 

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

参照元 ini_mbx().

#define LOG_INI_MBX_LEAVE ( ercd   ) 

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

参照元 ini_mbx().

#define LOG_PRCV_MBX_ENTER ( mbxid,
ppk_msg   ) 

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

参照元 prcv_mbx().

#define LOG_PRCV_MBX_LEAVE ( ercd,
pk_msg   ) 

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

参照元 prcv_mbx().

#define LOG_RCV_MBX_ENTER ( mbxid,
ppk_msg   ) 

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

参照元 rcv_mbx().

#define LOG_RCV_MBX_LEAVE ( ercd,
pk_msg   ) 

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

参照元 rcv_mbx().

#define LOG_REF_MBX_ENTER ( mbxid,
pk_rmbx   ) 

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

参照元 ref_mbx().

#define LOG_REF_MBX_LEAVE ( ercd,
pk_rmbx   ) 

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

参照元 ref_mbx().

#define LOG_SND_MBX_ENTER ( mbxid,
pk_msg   ) 

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

参照元 snd_mbx().

#define LOG_SND_MBX_LEAVE ( ercd   ) 

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

参照元 snd_mbx().

#define LOG_TRCV_MBX_ENTER ( mbxid,
ppk_msg,
tmout   ) 

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

参照元 trcv_mbx().

#define LOG_TRCV_MBX_LEAVE ( ercd,
pk_msg   ) 

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

参照元 trcv_mbx().

#define MSGPRI ( pk_msg   )     (((T_MSG_PRI *) pk_msg)->msgpri)

mailbox.c138 行で定義されています。

参照元 enqueue_msg_pri(), と snd_mbx().

#define tnum_mbx   ((uint_t)(tmax_mbxid - TMIN_MBXID + 1))

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

参照元 initialize_mailbox().


関数

Inline void enqueue_msg_pri ( T_MSG **  ppk_prevmsg_next,
T_MSG pk_msg 
)

mailbox.c144 行で定義されています。

参照先 MSGPRI, NULL, と t_msg::pk_next.

参照元 snd_mbx().

00145 {
00146     T_MSG   *pk_nextmsg;
00147 
00148     while ((pk_nextmsg = *ppk_prevmsg_next) != NULL) {
00149         if (MSGPRI(pk_nextmsg) > MSGPRI(pk_msg)) {
00150             break;
00151         }
00152         ppk_prevmsg_next = &(pk_nextmsg->pk_next);
00153     }
00154     pk_msg->pk_next = pk_nextmsg;
00155     *ppk_prevmsg_next = pk_msg;
00156 }

ER ini_mbx ( ID  mbxid  ) 

mailbox.c339 行で定義されています。

参照先 CHECK_MBXID, CHECK_TSKCTX_UNL, dispatch, E_OK, get_mbxcb, init_wait_queue, LOG_INI_MBX_ENTER, LOG_INI_MBX_LEAVE, NULL, mailbox_control_block::pk_head, t_lock_cpu, t_unlock_cpu, と mailbox_control_block::wait_queue.

00340 {
00341     MBXCB   *p_mbxcb;
00342     bool_t  dspreq;
00343     ER      ercd;
00344     
00345     LOG_INI_MBX_ENTER(mbxid);
00346     CHECK_TSKCTX_UNL();
00347     CHECK_MBXID(mbxid);
00348     p_mbxcb = get_mbxcb(mbxid);
00349 
00350     t_lock_cpu();
00351     dspreq = init_wait_queue(&(p_mbxcb->wait_queue));
00352     p_mbxcb->pk_head = NULL;
00353     if (dspreq) {
00354         dispatch();
00355     }
00356     ercd = E_OK;
00357     t_unlock_cpu();
00358 
00359   error_exit:
00360     LOG_INI_MBX_LEAVE(ercd);
00361     return(ercd);
00362 }

void initialize_mailbox ( void   ) 

mailbox.c121 行で定義されています。

参照先 mbxcb_table, mbxinib_table, NULL, mailbox_control_block::p_mbxinib, mailbox_control_block::pk_head, queue_initialize(), tnum_mbx, と mailbox_control_block::wait_queue.

00122 {
00123     uint_t  i;
00124     MBXCB   *p_mbxcb;
00125 
00126     for (p_mbxcb = mbxcb_table, i = 0; i < tnum_mbx; p_mbxcb++, i++) {
00127         queue_initialize(&(p_mbxcb->wait_queue));
00128         p_mbxcb->p_mbxinib = &(mbxinib_table[i]);
00129         p_mbxcb->pk_head = NULL;
00130     }
00131 }

ER prcv_mbx ( ID  mbxid,
T_MSG **  ppk_msg 
)

mailbox.c258 行で定義されています。

参照先 CHECK_MBXID, CHECK_TSKCTX_UNL, E_OK, E_TMOUT, get_mbxcb, LOG_PRCV_MBX_ENTER, LOG_PRCV_MBX_LEAVE, NULL, mailbox_control_block::pk_head, t_msg::pk_next, t_lock_cpu, と t_unlock_cpu.

00259 {
00260     MBXCB   *p_mbxcb;
00261     ER      ercd;
00262     
00263     LOG_PRCV_MBX_ENTER(mbxid, ppk_msg);
00264     CHECK_TSKCTX_UNL();
00265     CHECK_MBXID(mbxid);
00266     p_mbxcb = get_mbxcb(mbxid);
00267     
00268     t_lock_cpu();
00269     if (p_mbxcb->pk_head != NULL) {
00270         *ppk_msg = p_mbxcb->pk_head;
00271         p_mbxcb->pk_head = (*ppk_msg)->pk_next;
00272         ercd = E_OK;
00273     }
00274     else {
00275         ercd = E_TMOUT;
00276     }
00277     t_unlock_cpu();
00278 
00279   error_exit:
00280     LOG_PRCV_MBX_LEAVE(ercd, *ppk_msg);
00281     return(ercd);
00282 }

ER rcv_mbx ( ID  mbxid,
T_MSG **  ppk_msg 
)

mailbox.c217 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_MBXID, dispatch, E_OK, get_mbxcb, LOG_RCV_MBX_ENTER, LOG_RCV_MBX_LEAVE, NULL, p_runtsk, mailbox_control_block::pk_head, t_msg::pk_next, t_lock_cpu, t_unlock_cpu, TS_WAIT_MBX, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait.

00218 {
00219     MBXCB   *p_mbxcb;
00220     WINFO_MBX winfo_mbx;
00221     ER      ercd;
00222     
00223     LOG_RCV_MBX_ENTER(mbxid, ppk_msg);
00224     CHECK_DISPATCH();
00225     CHECK_MBXID(mbxid);
00226     p_mbxcb = get_mbxcb(mbxid);
00227     
00228     t_lock_cpu();
00229     if (p_mbxcb->pk_head != NULL) {
00230         *ppk_msg = p_mbxcb->pk_head;
00231         p_mbxcb->pk_head = (*ppk_msg)->pk_next;
00232         ercd = E_OK;
00233     }
00234     else {
00235         p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
00236         wobj_make_wait((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx);
00237         dispatch();
00238         ercd = winfo_mbx.winfo.wercd;
00239         if (ercd == E_OK) {
00240             *ppk_msg = winfo_mbx.pk_msg;
00241         }
00242     }
00243     t_unlock_cpu();
00244 
00245   error_exit:
00246     LOG_RCV_MBX_LEAVE(ercd, *ppk_msg);
00247     return(ercd);
00248 }

ER ref_mbx ( ID  mbxid,
T_RMBX pk_rmbx 
)

mailbox.c372 行で定義されています。

参照先 CHECK_MBXID, CHECK_TSKCTX_UNL, E_OK, get_mbxcb, LOG_REF_MBX_ENTER, LOG_REF_MBX_LEAVE, mailbox_control_block::pk_head, t_rmbx::pk_msg, t_lock_cpu, t_unlock_cpu, mailbox_control_block::wait_queue, wait_tskid(), と t_rmbx::wtskid.

00373 {
00374     MBXCB   *p_mbxcb;
00375     ER      ercd;
00376     
00377     LOG_REF_MBX_ENTER(mbxid, pk_rmbx);
00378     CHECK_TSKCTX_UNL();
00379     CHECK_MBXID(mbxid);
00380     p_mbxcb = get_mbxcb(mbxid);
00381 
00382     t_lock_cpu();
00383     pk_rmbx->wtskid = wait_tskid(&(p_mbxcb->wait_queue));
00384     pk_rmbx->pk_msg = p_mbxcb->pk_head;
00385     ercd = E_OK;
00386     t_unlock_cpu();
00387 
00388   error_exit:
00389     LOG_REF_MBX_LEAVE(ercd, pk_rmbx);
00390     return(ercd);
00391 }

ER snd_mbx ( ID  mbxid,
T_MSG pk_msg 
)

mailbox.c164 行で定義されています。

参照先 CHECK_MBXID, CHECK_PAR, CHECK_TSKCTX_UNL, dispatch, E_OK, enqueue_msg_pri(), get_mbxcb, LOG_SND_MBX_ENTER, LOG_SND_MBX_LEAVE, mailbox_initialization_block::maxmpri, mailbox_initialization_block::mbxatr, MSGPRI, NULL, mailbox_control_block::p_mbxinib, task_control_block::p_winfo, mailbox_control_block::pk_head, mailbox_control_block::pk_last, t_msg::pk_next, queue_delete_next(), queue_empty(), t_lock_cpu, t_unlock_cpu, TA_MPRI, TMIN_MPRI, wait_complete, と mailbox_control_block::wait_queue.

00165 {
00166     MBXCB   *p_mbxcb;
00167     TCB     *p_tcb;
00168     ER      ercd;
00169     
00170     LOG_SND_MBX_ENTER(mbxid, pk_msg);
00171     CHECK_TSKCTX_UNL();
00172     CHECK_MBXID(mbxid);
00173     p_mbxcb = get_mbxcb(mbxid);
00174     CHECK_PAR((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) == 0U
00175                 || (TMIN_MPRI <= MSGPRI(pk_msg)
00176                     && MSGPRI(pk_msg) <= p_mbxcb->p_mbxinib->maxmpri));
00177 
00178     t_lock_cpu();
00179     if (!queue_empty(&(p_mbxcb->wait_queue))) {
00180         p_tcb = (TCB *) queue_delete_next(&(p_mbxcb->wait_queue));
00181         ((WINFO_MBX *)(p_tcb->p_winfo))->pk_msg = pk_msg;
00182         if (wait_complete(p_tcb)) {
00183             dispatch();
00184         }
00185         ercd = E_OK;
00186     }
00187     else if ((p_mbxcb->p_mbxinib->mbxatr & TA_MPRI) != 0U) {
00188         enqueue_msg_pri(&(p_mbxcb->pk_head), pk_msg);
00189         ercd = E_OK;
00190     }
00191     else {
00192         pk_msg->pk_next = NULL;
00193         if (p_mbxcb->pk_head != NULL) {
00194             p_mbxcb->pk_last->pk_next = pk_msg;
00195         }
00196         else {
00197             p_mbxcb->pk_head = pk_msg;
00198         }
00199         p_mbxcb->pk_last = pk_msg;
00200         ercd = E_OK;
00201     }
00202     t_unlock_cpu();
00203 
00204   error_exit:
00205     LOG_SND_MBX_LEAVE(ercd);
00206     return(ercd);
00207 }

ER trcv_mbx ( ID  mbxid,
T_MSG **  ppk_msg,
TMO  tmout 
)

mailbox.c292 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_MBXID, CHECK_TMOUT, dispatch, E_OK, E_TMOUT, get_mbxcb, LOG_TRCV_MBX_ENTER, LOG_TRCV_MBX_LEAVE, NULL, p_runtsk, mailbox_control_block::pk_head, t_msg::pk_next, t_lock_cpu, t_unlock_cpu, TMO_POL, TS_WAIT_MBX, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait_tmout.

00293 {
00294     MBXCB   *p_mbxcb;
00295     WINFO_MBX winfo_mbx;
00296     TMEVTB  tmevtb;
00297     ER      ercd;
00298     
00299     LOG_TRCV_MBX_ENTER(mbxid, ppk_msg, tmout);
00300     CHECK_DISPATCH();
00301     CHECK_MBXID(mbxid);
00302     CHECK_TMOUT(tmout);
00303     p_mbxcb = get_mbxcb(mbxid);
00304     
00305     t_lock_cpu();
00306     if (p_mbxcb->pk_head != NULL) {
00307         *ppk_msg = p_mbxcb->pk_head;
00308         p_mbxcb->pk_head = (*ppk_msg)->pk_next;
00309         ercd = E_OK;
00310     }
00311     else if (tmout == TMO_POL) {
00312         ercd = E_TMOUT;
00313     }
00314     else {
00315         p_runtsk->tstat = (TS_WAITING | TS_WAIT_MBX);
00316         wobj_make_wait_tmout((WOBJCB *) p_mbxcb, (WINFO_WOBJ *) &winfo_mbx,
00317                                                         &tmevtb, tmout);
00318         dispatch();
00319         ercd = winfo_mbx.winfo.wercd;
00320         if (ercd == E_OK) {
00321             *ppk_msg = winfo_mbx.pk_msg;
00322         }
00323     }
00324     t_unlock_cpu();
00325 
00326   error_exit:
00327     LOG_TRCV_MBX_LEAVE(ercd, *ppk_msg);
00328     return(ercd);
00329 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作