pridataq.c

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

ソースコードを見る。

マクロ定義

#define LOG_SND_PDQ_ENTER(pdqid, data, datapri)
#define LOG_SND_PDQ_LEAVE(ercd)
#define LOG_PSND_PDQ_ENTER(pdqid, data, datapri)
#define LOG_PSND_PDQ_LEAVE(ercd)
#define LOG_IPSND_PDQ_ENTER(pdqid, data, datapri)
#define LOG_IPSND_PDQ_LEAVE(ercd)
#define LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout)
#define LOG_TSND_PDQ_LEAVE(ercd)
#define LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri)
#define LOG_RCV_PDQ_LEAVE(ercd, data, datapri)
#define LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri)
#define LOG_PRCV_PDQ_LEAVE(ercd, data, datapri)
#define LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout)
#define LOG_TRCV_PDQ_LEAVE(ercd, data, datapri)
#define LOG_INI_PDQ_ENTER(pdqid)
#define LOG_INI_PDQ_LEAVE(ercd)
#define LOG_REF_PDQ_ENTER(pdqid, pk_rpdq)
#define LOG_REF_PDQ_LEAVE(ercd, pk_rpdq)
#define tnum_pdq   ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))
#define INDEX_PDQ(pdqid)   ((uint_t)((pdqid) - TMIN_PDQID))
#define get_pdqcb(pdqid)   (&(pdqcb_table[INDEX_PDQ(pdqid)]))

関数

void initialize_pridataq (void)
void enqueue_pridata (PDQCB *p_pdqcb, intptr_t data, PRI datapri)
void dequeue_pridata (PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri)
bool_t send_pridata (PDQCB *p_pdqcb, intptr_t data, PRI datapri, bool_t *p_reqdsp)
bool_t receive_pridata (PDQCB *p_pdqcb, intptr_t *p_data, PRI *p_datapri, bool_t *p_reqdsp)
ER snd_pdq (ID pdqid, intptr_t data, PRI datapri)
ER psnd_pdq (ID pdqid, intptr_t data, PRI datapri)
ER ipsnd_pdq (ID pdqid, intptr_t data, PRI datapri)
ER tsnd_pdq (ID pdqid, intptr_t data, PRI datapri, TMO tmout)
ER rcv_pdq (ID pdqid, intptr_t *p_data, PRI *p_datapri)
ER prcv_pdq (ID pdqid, intptr_t *p_data, PRI *p_datapri)
ER trcv_pdq (ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
ER ini_pdq (ID pdqid)
ER ref_pdq (ID pdqid, T_RPDQ *pk_rpdq)


マクロ定義

#define get_pdqcb ( pdqid   )     (&(pdqcb_table[INDEX_PDQ(pdqid)]))

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

参照元 ini_pdq(), ipsnd_pdq(), prcv_pdq(), psnd_pdq(), rcv_pdq(), ref_pdq(), snd_pdq(), trcv_pdq(), と tsnd_pdq().

#define INDEX_PDQ ( pdqid   )     ((uint_t)((pdqid) - TMIN_PDQID))

pridataq.c137 行で定義されています。

#define LOG_INI_PDQ_ENTER ( pdqid   ) 

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

参照元 ini_pdq().

#define LOG_INI_PDQ_LEAVE ( ercd   ) 

pridataq.c117 行で定義されています。

参照元 ini_pdq().

#define LOG_IPSND_PDQ_ENTER ( pdqid,
data,
datapri   ) 

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

参照元 ipsnd_pdq().

#define LOG_IPSND_PDQ_LEAVE ( ercd   ) 

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

参照元 ipsnd_pdq().

#define LOG_PRCV_PDQ_ENTER ( pdqid,
p_data,
p_datapri   ) 

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

参照元 prcv_pdq().

#define LOG_PRCV_PDQ_LEAVE ( ercd,
data,
datapri   ) 

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

参照元 prcv_pdq().

#define LOG_PSND_PDQ_ENTER ( pdqid,
data,
datapri   ) 

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

参照元 psnd_pdq().

#define LOG_PSND_PDQ_LEAVE ( ercd   ) 

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

参照元 psnd_pdq().

#define LOG_RCV_PDQ_ENTER ( pdqid,
p_data,
p_datapri   ) 

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

参照元 rcv_pdq().

#define LOG_RCV_PDQ_LEAVE ( ercd,
data,
datapri   ) 

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

参照元 rcv_pdq().

#define LOG_REF_PDQ_ENTER ( pdqid,
pk_rpdq   ) 

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

参照元 ref_pdq().

#define LOG_REF_PDQ_LEAVE ( ercd,
pk_rpdq   ) 

pridataq.c125 行で定義されています。

参照元 ref_pdq().

#define LOG_SND_PDQ_ENTER ( pdqid,
data,
datapri   ) 

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

参照元 snd_pdq().

#define LOG_SND_PDQ_LEAVE ( ercd   ) 

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

参照元 snd_pdq().

#define LOG_TRCV_PDQ_ENTER ( pdqid,
p_data,
p_datapri,
tmout   ) 

pridataq.c105 行で定義されています。

参照元 trcv_pdq().

#define LOG_TRCV_PDQ_LEAVE ( ercd,
data,
datapri   ) 

pridataq.c109 行で定義されています。

参照元 trcv_pdq().

#define LOG_TSND_PDQ_ENTER ( pdqid,
data,
datapri,
tmout   ) 

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

参照元 tsnd_pdq().

#define LOG_TSND_PDQ_LEAVE ( ercd   ) 

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

参照元 tsnd_pdq().

#define tnum_pdq   ((uint_t)(tmax_pdqid - TMIN_PDQID + 1))

pridataq.c131 行で定義されています。

参照元 initialize_pridataq().


関数

void dequeue_pridata ( PDQCB p_pdqcb,
intptr_t *  p_data,
PRI p_datapri 
)

pridataq.c207 行で定義されています。

参照先 pridataq_control_block::count, pridata_management_block::data, pridata_management_block::datapri, pridataq_control_block::p_freelist, pridataq_control_block::p_head, と pridata_management_block::p_next.

00208 {
00209     PDQMB   *p_pdqmb;
00210 
00211     p_pdqmb = p_pdqcb->p_head;
00212     p_pdqcb->p_head = p_pdqmb->p_next;
00213     p_pdqcb->count--;
00214 
00215     *p_data = p_pdqmb->data;
00216     *p_datapri = p_pdqmb->datapri;
00217 
00218     p_pdqmb->p_next = p_pdqcb->p_freelist;
00219     p_pdqcb->p_freelist = p_pdqmb;
00220 }

void enqueue_pridata ( PDQCB p_pdqcb,
intptr_t  data,
PRI  datapri 
)

pridataq.c170 行で定義されています。

参照先 pridataq_control_block::count, pridata_management_block::data, pridata_management_block::datapri, NULL, pridataq_control_block::p_freelist, pridataq_control_block::p_head, pridata_management_block::p_next, pridataq_control_block::p_pdqinib, pridataq_initialization_block::p_pdqmb, と pridataq_control_block::unused.

00171 {
00172     PDQMB   *p_pdqmb;
00173     PDQMB   **pp_prev_next, *p_next;
00174 
00175     if (p_pdqcb->p_freelist != NULL) {
00176         p_pdqmb = p_pdqcb->p_freelist;
00177         p_pdqcb->p_freelist = p_pdqmb->p_next;
00178     }
00179     else {
00180         p_pdqmb = p_pdqcb->p_pdqinib->p_pdqmb + p_pdqcb->unused;
00181         p_pdqcb->unused++;
00182     }
00183 
00184     p_pdqmb->data = data;
00185     p_pdqmb->datapri = datapri;
00186 
00187     pp_prev_next = &(p_pdqcb->p_head);
00188     while ((p_next = *pp_prev_next) != NULL) {
00189         if (p_next->datapri > datapri) {
00190             break;
00191         }
00192         pp_prev_next = &(p_next->p_next);
00193     }
00194     p_pdqmb->p_next = p_next;
00195     *pp_prev_next = p_pdqmb;
00196     p_pdqcb->count++;
00197 }

ER ini_pdq ( ID  pdqid  ) 

pridataq.c601 行で定義されています。

参照先 CHECK_PDQID, CHECK_TSKCTX_UNL, pridataq_control_block::count, dispatch, E_OK, get_pdqcb, init_wait_queue, LOG_INI_PDQ_ENTER, LOG_INI_PDQ_LEAVE, NULL, pridataq_control_block::p_freelist, pridataq_control_block::p_head, pridataq_control_block::rwait_queue, pridataq_control_block::swait_queue, t_lock_cpu, t_unlock_cpu, と pridataq_control_block::unused.

00602 {
00603     PDQCB   *p_pdqcb;
00604     bool_t  dspreq;
00605     ER      ercd;
00606     
00607     LOG_INI_PDQ_ENTER(pdqid);
00608     CHECK_TSKCTX_UNL();
00609     CHECK_PDQID(pdqid);
00610     p_pdqcb = get_pdqcb(pdqid);
00611 
00612     t_lock_cpu();
00613     dspreq = init_wait_queue(&(p_pdqcb->swait_queue));
00614     if (init_wait_queue(&(p_pdqcb->rwait_queue))) {
00615         dspreq = true;
00616     }
00617     p_pdqcb->count = 0U;
00618     p_pdqcb->p_head = NULL;
00619     p_pdqcb->unused = 0U;
00620     p_pdqcb->p_freelist = NULL;
00621     if (dspreq) {
00622         dispatch();
00623     }
00624     ercd = E_OK;
00625     t_unlock_cpu();
00626 
00627   error_exit:
00628     LOG_INI_PDQ_LEAVE(ercd);
00629     return(ercd);
00630 }

void initialize_pridataq ( void   ) 

pridataq.c146 行で定義されています。

参照先 pridataq_control_block::count, NULL, pridataq_control_block::p_freelist, pridataq_control_block::p_head, pridataq_control_block::p_pdqinib, pdqcb_table, pdqinib_table, queue_initialize(), pridataq_control_block::rwait_queue, pridataq_control_block::swait_queue, tnum_pdq, と pridataq_control_block::unused.

00147 {
00148     uint_t  i;
00149     PDQCB   *p_pdqcb;
00150 
00151     for (p_pdqcb = pdqcb_table, i = 0; i < tnum_pdq; p_pdqcb++, i++) {
00152         queue_initialize(&(p_pdqcb->swait_queue));
00153         p_pdqcb->p_pdqinib = &(pdqinib_table[i]);
00154         queue_initialize(&(p_pdqcb->rwait_queue));
00155         p_pdqcb->count = 0U;
00156         p_pdqcb->p_head = NULL;
00157         p_pdqcb->unused = 0U;
00158         p_pdqcb->p_freelist = NULL;
00159     }
00160 }

ER ipsnd_pdq ( ID  pdqid,
intptr_t  data,
PRI  datapri 
)

pridataq.c380 行で定義されています。

参照先 CHECK_INTCTX_UNL, CHECK_PAR, CHECK_PDQID, E_OK, E_TMOUT, get_pdqcb, i_lock_cpu, i_unlock_cpu, LOG_IPSND_PDQ_ENTER, LOG_IPSND_PDQ_LEAVE, reqflg, send_pridata, と TMIN_DPRI.

00381 {
00382     PDQCB   *p_pdqcb;
00383     bool_t  reqdsp;
00384     ER      ercd;
00385 
00386     LOG_IPSND_PDQ_ENTER(pdqid, data, datapri);
00387     CHECK_INTCTX_UNL();
00388     CHECK_PDQID(pdqid);
00389     p_pdqcb = get_pdqcb(pdqid);
00390     CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
00391 
00392     i_lock_cpu();
00393     if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
00394         if (reqdsp) {
00395             reqflg = true;
00396         }
00397         ercd = E_OK;
00398     }
00399     else {
00400         ercd = E_TMOUT;
00401     }
00402     i_unlock_cpu();
00403 
00404   error_exit:
00405     LOG_IPSND_PDQ_LEAVE(ercd);
00406     return(ercd);
00407 }

ER prcv_pdq ( ID  pdqid,
intptr_t *  p_data,
PRI p_datapri 
)

pridataq.c513 行で定義されています。

参照先 CHECK_PDQID, CHECK_TSKCTX_UNL, dispatch, E_OK, E_TMOUT, get_pdqcb, LOG_PRCV_PDQ_ENTER, LOG_PRCV_PDQ_LEAVE, receive_pridata, t_lock_cpu, と t_unlock_cpu.

00514 {
00515     PDQCB   *p_pdqcb;
00516     bool_t  reqdsp;
00517     ER      ercd;
00518 
00519     LOG_PRCV_PDQ_ENTER(pdqid, p_data, p_datapri);
00520     CHECK_TSKCTX_UNL();
00521     CHECK_PDQID(pdqid);
00522     p_pdqcb = get_pdqcb(pdqid);
00523 
00524     t_lock_cpu();
00525     if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
00526         if (reqdsp) {
00527             dispatch();
00528         }
00529         ercd = E_OK;
00530     }
00531     else {
00532         ercd = E_TMOUT;
00533     }
00534     t_unlock_cpu();
00535 
00536   error_exit:
00537     LOG_PRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
00538     return(ercd);
00539 }

ER psnd_pdq ( ID  pdqid,
intptr_t  data,
PRI  datapri 
)

pridataq.c343 行で定義されています。

参照先 CHECK_PAR, CHECK_PDQID, CHECK_TSKCTX_UNL, dispatch, E_OK, E_TMOUT, get_pdqcb, LOG_PSND_PDQ_ENTER, LOG_PSND_PDQ_LEAVE, send_pridata, t_lock_cpu, t_unlock_cpu, と TMIN_DPRI.

00344 {
00345     PDQCB   *p_pdqcb;
00346     bool_t  reqdsp;
00347     ER      ercd;
00348 
00349     LOG_PSND_PDQ_ENTER(pdqid, data, datapri);
00350     CHECK_TSKCTX_UNL();
00351     CHECK_PDQID(pdqid);
00352     p_pdqcb = get_pdqcb(pdqid);
00353     CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
00354 
00355     t_lock_cpu();
00356     if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
00357         if (reqdsp) {
00358             dispatch();
00359         }
00360         ercd = E_OK;
00361     }
00362     else {
00363         ercd = E_TMOUT;
00364     }
00365     t_unlock_cpu();
00366 
00367   error_exit:
00368     LOG_PSND_PDQ_LEAVE(ercd);
00369     return(ercd);
00370 }

ER rcv_pdq ( ID  pdqid,
intptr_t *  p_data,
PRI p_datapri 
)

pridataq.c466 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_PDQID, dispatch, E_OK, get_pdqcb, LOG_RCV_PDQ_ENTER, LOG_RCV_PDQ_LEAVE, LOG_TSKSTAT, make_wait(), p_runtsk, queue_insert_prev(), receive_pridata, pridataq_control_block::rwait_queue, t_lock_cpu, t_unlock_cpu, TS_WAIT_RPDQ, TS_WAITING, と waiting_information::wercd.

00467 {
00468     PDQCB   *p_pdqcb;
00469     WINFO_PDQ winfo_pdq;
00470     bool_t  reqdsp;
00471     ER      ercd;
00472 
00473     LOG_RCV_PDQ_ENTER(pdqid, p_data, p_datapri);
00474     CHECK_DISPATCH();
00475     CHECK_PDQID(pdqid);
00476     p_pdqcb = get_pdqcb(pdqid);
00477 
00478     t_lock_cpu();
00479     if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
00480         if (reqdsp) {
00481             dispatch();
00482         }
00483         ercd = E_OK;
00484     }
00485     else {
00486         p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
00487         make_wait((WINFO *) &winfo_pdq);
00488         queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
00489         winfo_pdq.p_pdqcb = p_pdqcb;
00490         LOG_TSKSTAT(p_runtsk);
00491         dispatch();
00492         ercd = winfo_pdq.winfo.wercd;
00493         if (ercd == E_OK) {
00494             *p_data = winfo_pdq.data;
00495             *p_datapri = winfo_pdq.datapri;
00496         }
00497     }
00498     t_unlock_cpu();
00499 
00500   error_exit:
00501     LOG_RCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
00502     return(ercd);
00503 }

bool_t receive_pridata ( PDQCB p_pdqcb,
intptr_t *  p_data,
PRI p_datapri,
bool_t p_reqdsp 
)

pridataq.c259 行で定義されています。

参照先 pridataq_control_block::count, dequeue_pridata, enqueue_pridata, task_control_block::p_winfo, queue_delete_next(), queue_empty(), pridataq_control_block::swait_queue, と wait_complete.

00261 {
00262     TCB     *p_tcb;
00263     intptr_t data;
00264     PRI     datapri;
00265 
00266     if (p_pdqcb->count > 0U) {
00267         dequeue_pridata(p_pdqcb, p_data, p_datapri);
00268         if (!queue_empty(&(p_pdqcb->swait_queue))) {
00269             p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
00270             data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
00271             datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
00272             enqueue_pridata(p_pdqcb, data, datapri);
00273             *p_reqdsp = wait_complete(p_tcb);
00274         }
00275         else {
00276             *p_reqdsp = false;
00277         }
00278         return(true);
00279     }
00280     else if (!queue_empty(&(p_pdqcb->swait_queue))) {
00281         p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->swait_queue));
00282         *p_data = ((WINFO_PDQ *)(p_tcb->p_winfo))->data;
00283         *p_datapri = ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri;
00284         *p_reqdsp = wait_complete(p_tcb);
00285         return(true);
00286     }
00287     else {
00288         return(false);
00289     }
00290 }

ER ref_pdq ( ID  pdqid,
T_RPDQ pk_rpdq 
)

pridataq.c640 行で定義されています。

参照先 CHECK_PDQID, CHECK_TSKCTX_UNL, pridataq_control_block::count, E_OK, get_pdqcb, LOG_REF_PDQ_ENTER, LOG_REF_PDQ_LEAVE, t_rpdq::rtskid, pridataq_control_block::rwait_queue, t_rpdq::spdqcnt, t_rpdq::stskid, pridataq_control_block::swait_queue, t_lock_cpu, t_unlock_cpu, と wait_tskid().

00641 {
00642     PDQCB   *p_pdqcb;
00643     ER      ercd;
00644     
00645     LOG_REF_PDQ_ENTER(pdqid, pk_rpdq);
00646     CHECK_TSKCTX_UNL();
00647     CHECK_PDQID(pdqid);
00648     p_pdqcb = get_pdqcb(pdqid);
00649 
00650     t_lock_cpu();
00651     pk_rpdq->stskid = wait_tskid(&(p_pdqcb->swait_queue));
00652     pk_rpdq->rtskid = wait_tskid(&(p_pdqcb->rwait_queue));
00653     pk_rpdq->spdqcnt = p_pdqcb->count;
00654     ercd = E_OK;
00655     t_unlock_cpu();
00656 
00657   error_exit:
00658     LOG_REF_PDQ_LEAVE(ercd, pk_rpdq);
00659     return(ercd);
00660 }

bool_t send_pridata ( PDQCB p_pdqcb,
intptr_t  data,
PRI  datapri,
bool_t p_reqdsp 
)

pridataq.c230 行で定義されています。

参照先 pridataq_control_block::count, enqueue_pridata, pridataq_control_block::p_pdqinib, task_control_block::p_winfo, pridataq_initialization_block::pdqcnt, queue_delete_next(), queue_empty(), pridataq_control_block::rwait_queue, と wait_complete.

00231 {
00232     TCB     *p_tcb;
00233 
00234     if (!queue_empty(&(p_pdqcb->rwait_queue))) {
00235         p_tcb = (TCB *) queue_delete_next(&(p_pdqcb->rwait_queue));
00236         ((WINFO_PDQ *)(p_tcb->p_winfo))->data = data;
00237         ((WINFO_PDQ *)(p_tcb->p_winfo))->datapri = datapri;
00238         *p_reqdsp = wait_complete(p_tcb);
00239         return(true);
00240     }
00241     else if (p_pdqcb->count < p_pdqcb->p_pdqinib->pdqcnt) {
00242         enqueue_pridata(p_pdqcb, data, datapri);
00243         *p_reqdsp = false;
00244         return(true);
00245     }
00246     else {
00247         return(false);
00248     }
00249 }

ER snd_pdq ( ID  pdqid,
intptr_t  data,
PRI  datapri 
)

pridataq.c300 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_PAR, CHECK_PDQID, pridataq_waiting_information::data, pridataq_waiting_information::datapri, dispatch, E_OK, get_pdqcb, LOG_SND_PDQ_ENTER, LOG_SND_PDQ_LEAVE, p_runtsk, send_pridata, t_lock_cpu, t_unlock_cpu, TMIN_DPRI, TS_WAIT_SPDQ, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait.

00301 {
00302     PDQCB   *p_pdqcb;
00303     WINFO_PDQ winfo_pdq;
00304     bool_t  reqdsp;
00305     ER      ercd;
00306 
00307     LOG_SND_PDQ_ENTER(pdqid, data, datapri);
00308     CHECK_DISPATCH();
00309     CHECK_PDQID(pdqid);
00310     p_pdqcb = get_pdqcb(pdqid);
00311     CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
00312 
00313     t_lock_cpu();
00314     if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
00315         if (reqdsp) {
00316             dispatch();
00317         }
00318         ercd = E_OK;
00319     }
00320     else {
00321         winfo_pdq.data = data;
00322         winfo_pdq.datapri = datapri;
00323         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
00324         wobj_make_wait((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq);
00325         dispatch();
00326         ercd = winfo_pdq.winfo.wercd;
00327     }
00328     t_unlock_cpu();
00329 
00330   error_exit:
00331     LOG_SND_PDQ_LEAVE(ercd);
00332     return(ercd);
00333 }

ER trcv_pdq ( ID  pdqid,
intptr_t *  p_data,
PRI p_datapri,
TMO  tmout 
)

pridataq.c549 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_PDQID, CHECK_TMOUT, dispatch, E_OK, E_TMOUT, get_pdqcb, LOG_TRCV_PDQ_ENTER, LOG_TRCV_PDQ_LEAVE, LOG_TSKSTAT, make_wait_tmout, p_runtsk, queue_insert_prev(), receive_pridata, pridataq_control_block::rwait_queue, t_lock_cpu, t_unlock_cpu, TMO_POL, TS_WAIT_RPDQ, TS_WAITING, と waiting_information::wercd.

00550 {
00551     PDQCB   *p_pdqcb;
00552     WINFO_PDQ winfo_pdq;
00553     TMEVTB  tmevtb;
00554     bool_t  reqdsp;
00555     ER      ercd;
00556 
00557     LOG_TRCV_PDQ_ENTER(pdqid, p_data, p_datapri, tmout);
00558     CHECK_DISPATCH();
00559     CHECK_PDQID(pdqid);
00560     CHECK_TMOUT(tmout);
00561     p_pdqcb = get_pdqcb(pdqid);
00562 
00563     t_lock_cpu();
00564     if (receive_pridata(p_pdqcb, p_data, p_datapri, &reqdsp)) {
00565         if (reqdsp) {
00566             dispatch();
00567         }
00568         ercd = E_OK;
00569     }
00570     else if (tmout == TMO_POL) {
00571         ercd = E_TMOUT;
00572     }
00573     else {
00574         p_runtsk->tstat = (TS_WAITING | TS_WAIT_RPDQ);
00575         make_wait_tmout((WINFO *) &winfo_pdq, &tmevtb, tmout);
00576         queue_insert_prev(&(p_pdqcb->rwait_queue), &(p_runtsk->task_queue));
00577         winfo_pdq.p_pdqcb = p_pdqcb;
00578         LOG_TSKSTAT(p_runtsk);
00579         dispatch();
00580         ercd = winfo_pdq.winfo.wercd;
00581         if (ercd == E_OK) {
00582             *p_data = winfo_pdq.data;
00583             *p_datapri = winfo_pdq.datapri;
00584         }
00585     }
00586     t_unlock_cpu();
00587 
00588   error_exit:
00589     LOG_TRCV_PDQ_LEAVE(ercd, *p_data, *p_datapri);
00590     return(ercd);
00591 }

ER tsnd_pdq ( ID  pdqid,
intptr_t  data,
PRI  datapri,
TMO  tmout 
)

pridataq.c417 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_PAR, CHECK_PDQID, CHECK_TMOUT, pridataq_waiting_information::data, pridataq_waiting_information::datapri, dispatch, E_OK, E_TMOUT, get_pdqcb, LOG_TSND_PDQ_ENTER, LOG_TSND_PDQ_LEAVE, p_runtsk, send_pridata, t_lock_cpu, t_unlock_cpu, TMIN_DPRI, TMO_POL, TS_WAIT_SPDQ, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait_tmout.

00418 {
00419     PDQCB   *p_pdqcb;
00420     WINFO_PDQ winfo_pdq;
00421     TMEVTB  tmevtb;
00422     bool_t  reqdsp;
00423     ER      ercd;
00424 
00425     LOG_TSND_PDQ_ENTER(pdqid, data, datapri, tmout);
00426     CHECK_DISPATCH();
00427     CHECK_PDQID(pdqid);
00428     CHECK_TMOUT(tmout);
00429     p_pdqcb = get_pdqcb(pdqid);
00430     CHECK_PAR(TMIN_DPRI <= datapri && datapri <= p_pdqcb->p_pdqinib->maxdpri);
00431 
00432     t_lock_cpu();
00433     if (send_pridata(p_pdqcb, data, datapri, &reqdsp)) {
00434         if (reqdsp) {
00435             dispatch();
00436         }
00437         ercd = E_OK;
00438     }
00439     else if (tmout == TMO_POL) {
00440         ercd = E_TMOUT;
00441     }
00442     else {
00443         winfo_pdq.data = data;
00444         winfo_pdq.datapri = datapri;
00445         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SPDQ);
00446         wobj_make_wait_tmout((WOBJCB *) p_pdqcb, (WINFO_WOBJ *) &winfo_pdq,
00447                                                         &tmevtb, tmout);
00448         dispatch();
00449         ercd = winfo_pdq.winfo.wercd;
00450     }
00451     t_unlock_cpu();
00452 
00453   error_exit:
00454     LOG_TSND_PDQ_LEAVE(ercd);
00455     return(ercd);
00456 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作