dataqueue.c

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

ソースコードを見る。

マクロ定義

#define LOG_SND_DTQ_ENTER(dtqid, data)
#define LOG_SND_DTQ_LEAVE(ercd)
#define LOG_PSND_DTQ_ENTER(dtqid, data)
#define LOG_PSND_DTQ_LEAVE(ercd)
#define LOG_IPSND_DTQ_ENTER(dtqid, data)
#define LOG_IPSND_DTQ_LEAVE(ercd)
#define LOG_TSND_DTQ_ENTER(dtqid, data, tmout)
#define LOG_TSND_DTQ_LEAVE(ercd)
#define LOG_FSND_DTQ_ENTER(dtqid, data)
#define LOG_FSND_DTQ_LEAVE(ercd)
#define LOG_IFSND_DTQ_ENTER(dtqid, data)
#define LOG_IFSND_DTQ_LEAVE(ercd)
#define LOG_RCV_DTQ_ENTER(dtqid, p_data)
#define LOG_RCV_DTQ_LEAVE(ercd, data)
#define LOG_PRCV_DTQ_ENTER(dtqid, p_data)
#define LOG_PRCV_DTQ_LEAVE(ercd, data)
#define LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout)
#define LOG_TRCV_DTQ_LEAVE(ercd, data)
#define LOG_INI_DTQ_ENTER(dtqid)
#define LOG_INI_DTQ_LEAVE(ercd)
#define LOG_REF_DTQ_ENTER(dtqid, pk_rdtq)
#define LOG_REF_DTQ_LEAVE(ercd, pk_rdtq)
#define tnum_dtq   ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))
#define INDEX_DTQ(dtqid)   ((uint_t)((dtqid) - TMIN_DTQID))
#define get_dtqcb(dtqid)   (&(dtqcb_table[INDEX_DTQ(dtqid)]))

関数

void initialize_dataqueue (void)
void enqueue_data (DTQCB *p_dtqcb, intptr_t data)
void force_enqueue_data (DTQCB *p_dtqcb, intptr_t data)
void dequeue_data (DTQCB *p_dtqcb, intptr_t *p_data)
bool_t send_data (DTQCB *p_dtqcb, intptr_t data, bool_t *p_reqdsp)
bool_t force_send_data (DTQCB *p_dtqcb, intptr_t data)
bool_t receive_data (DTQCB *p_dtqcb, intptr_t *p_data, bool_t *p_reqdsp)
ER snd_dtq (ID dtqid, intptr_t data)
ER psnd_dtq (ID dtqid, intptr_t data)
ER ipsnd_dtq (ID dtqid, intptr_t data)
ER tsnd_dtq (ID dtqid, intptr_t data, TMO tmout)
ER fsnd_dtq (ID dtqid, intptr_t data)
ER ifsnd_dtq (ID dtqid, intptr_t data)
ER rcv_dtq (ID dtqid, intptr_t *p_data)
ER prcv_dtq (ID dtqid, intptr_t *p_data)
ER trcv_dtq (ID dtqid, intptr_t *p_data, TMO tmout)
ER ini_dtq (ID dtqid)
ER ref_dtq (ID dtqid, T_RDTQ *pk_rdtq)


マクロ定義

#define get_dtqcb ( dtqid   )     (&(dtqcb_table[INDEX_DTQ(dtqid)]))

#define INDEX_DTQ ( dtqid   )     ((uint_t)((dtqid) - TMIN_DTQID))

dataqueue.c152 行で定義されています。

#define LOG_FSND_DTQ_ENTER ( dtqid,
data   ) 

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

参照元 fsnd_dtq().

#define LOG_FSND_DTQ_LEAVE ( ercd   ) 

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

参照元 fsnd_dtq().

#define LOG_IFSND_DTQ_ENTER ( dtqid,
data   ) 

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

参照元 ifsnd_dtq().

#define LOG_IFSND_DTQ_LEAVE ( ercd   ) 

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

参照元 ifsnd_dtq().

#define LOG_INI_DTQ_ENTER ( dtqid   ) 

dataqueue.c129 行で定義されています。

参照元 ini_dtq().

#define LOG_INI_DTQ_LEAVE ( ercd   ) 

dataqueue.c133 行で定義されています。

参照元 ini_dtq().

#define LOG_IPSND_DTQ_ENTER ( dtqid,
data   ) 

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

参照元 ipsnd_dtq().

#define LOG_IPSND_DTQ_LEAVE ( ercd   ) 

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

参照元 ipsnd_dtq().

#define LOG_PRCV_DTQ_ENTER ( dtqid,
p_data   ) 

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

参照元 prcv_dtq().

#define LOG_PRCV_DTQ_LEAVE ( ercd,
data   ) 

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

参照元 prcv_dtq().

#define LOG_PSND_DTQ_ENTER ( dtqid,
data   ) 

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

参照元 psnd_dtq().

#define LOG_PSND_DTQ_LEAVE ( ercd   ) 

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

参照元 psnd_dtq().

#define LOG_RCV_DTQ_ENTER ( dtqid,
p_data   ) 

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

参照元 rcv_dtq().

#define LOG_RCV_DTQ_LEAVE ( ercd,
data   ) 

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

参照元 rcv_dtq().

#define LOG_REF_DTQ_ENTER ( dtqid,
pk_rdtq   ) 

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

参照元 ref_dtq().

#define LOG_REF_DTQ_LEAVE ( ercd,
pk_rdtq   ) 

dataqueue.c141 行で定義されています。

参照元 ref_dtq().

#define LOG_SND_DTQ_ENTER ( dtqid,
data   ) 

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

参照元 snd_dtq().

#define LOG_SND_DTQ_LEAVE ( ercd   ) 

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

参照元 snd_dtq().

#define LOG_TRCV_DTQ_ENTER ( dtqid,
p_data,
tmout   ) 

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

参照元 trcv_dtq().

#define LOG_TRCV_DTQ_LEAVE ( ercd,
data   ) 

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

参照元 trcv_dtq().

#define LOG_TSND_DTQ_ENTER ( dtqid,
data,
tmout   ) 

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

参照元 tsnd_dtq().

#define LOG_TSND_DTQ_LEAVE ( ercd   ) 

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

参照元 tsnd_dtq().

#define tnum_dtq   ((uint_t)(tmax_dtqid - TMIN_DTQID + 1))

dataqueue.c147 行で定義されています。

参照元 initialize_dataqueue().


関数

void dequeue_data ( DTQCB p_dtqcb,
intptr_t *  p_data 
)

dataqueue.c225 行で定義されています。

参照先 dataqueue_control_block::count, dataqueue_initialization_block::dtqcnt, dataqueue_control_block::head, dataqueue_control_block::p_dtqinib, と dataqueue_initialization_block::p_dtqmb.

00226 {
00227     *p_data = *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->head);
00228     p_dtqcb->count--;
00229     p_dtqcb->head++;
00230     if (p_dtqcb->head >= p_dtqcb->p_dtqinib->dtqcnt) {
00231         p_dtqcb->head = 0U;
00232     }
00233 }

void enqueue_data ( DTQCB p_dtqcb,
intptr_t  data 
)

dataqueue.c184 行で定義されています。

参照先 dataqueue_control_block::count, dataqueue_initialization_block::dtqcnt, dataqueue_control_block::p_dtqinib, dataqueue_initialization_block::p_dtqmb, と dataqueue_control_block::tail.

00185 {
00186     *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
00187     p_dtqcb->count++;
00188     p_dtqcb->tail++;
00189     if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
00190         p_dtqcb->tail = 0U;
00191     }
00192 }

void force_enqueue_data ( DTQCB p_dtqcb,
intptr_t  data 
)

dataqueue.c202 行で定義されています。

参照先 dataqueue_control_block::count, dataqueue_initialization_block::dtqcnt, dataqueue_control_block::head, dataqueue_control_block::p_dtqinib, dataqueue_initialization_block::p_dtqmb, と dataqueue_control_block::tail.

00203 {
00204     *(p_dtqcb->p_dtqinib->p_dtqmb + p_dtqcb->tail) = data;
00205     p_dtqcb->tail++;
00206     if (p_dtqcb->tail >= p_dtqcb->p_dtqinib->dtqcnt) {
00207         p_dtqcb->tail = 0U;
00208     }
00209     if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
00210         p_dtqcb->count++;
00211     }
00212     else {
00213         p_dtqcb->head = p_dtqcb->tail;
00214     }
00215 }

bool_t force_send_data ( DTQCB p_dtqcb,
intptr_t  data 
)

dataqueue.c271 行で定義されています。

参照先 force_enqueue_data, task_control_block::p_winfo, queue_delete_next(), queue_empty(), dataqueue_control_block::rwait_queue, と wait_complete.

00272 {
00273     TCB     *p_tcb;
00274 
00275     if (!queue_empty(&(p_dtqcb->rwait_queue))) {
00276         p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
00277         ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
00278         return(wait_complete(p_tcb));
00279     }
00280     else {
00281         force_enqueue_data(p_dtqcb, data);
00282         return(false);
00283     }
00284 }

ER fsnd_dtq ( ID  dtqid,
intptr_t  data 
)

dataqueue.c491 行で定義されています。

参照先 CHECK_DTQID, CHECK_ILUSE, CHECK_TSKCTX_UNL, dispatch, dataqueue_initialization_block::dtqcnt, E_OK, force_send_data, get_dtqcb, LOG_FSND_DTQ_ENTER, LOG_FSND_DTQ_LEAVE, dataqueue_control_block::p_dtqinib, t_lock_cpu, と t_unlock_cpu.

00492 {
00493     DTQCB   *p_dtqcb;   
00494     ER      ercd;
00495 
00496     LOG_FSND_DTQ_ENTER(dtqid, data);
00497     CHECK_TSKCTX_UNL();
00498     CHECK_DTQID(dtqid);
00499     p_dtqcb = get_dtqcb(dtqid);
00500     CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
00501 
00502     t_lock_cpu();
00503     if (force_send_data(p_dtqcb, data)) {
00504         dispatch();
00505     }
00506     ercd = E_OK;
00507     t_unlock_cpu();
00508 
00509   error_exit:
00510     LOG_FSND_DTQ_LEAVE(ercd);
00511     return(ercd);
00512 }

ER ifsnd_dtq ( ID  dtqid,
intptr_t  data 
)

dataqueue.c522 行で定義されています。

参照先 CHECK_DTQID, CHECK_ILUSE, CHECK_INTCTX_UNL, dataqueue_initialization_block::dtqcnt, E_OK, force_send_data, get_dtqcb, i_lock_cpu, i_unlock_cpu, LOG_IFSND_DTQ_ENTER, LOG_IFSND_DTQ_LEAVE, dataqueue_control_block::p_dtqinib, と reqflg.

00523 {
00524     DTQCB   *p_dtqcb;
00525     ER      ercd;
00526 
00527     LOG_IFSND_DTQ_ENTER(dtqid, data);
00528     CHECK_INTCTX_UNL();
00529     CHECK_DTQID(dtqid);
00530     p_dtqcb = get_dtqcb(dtqid);
00531     CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U);
00532 
00533     i_lock_cpu();
00534     if (force_send_data(p_dtqcb, data)) {
00535         reqflg = true;
00536     }
00537     ercd = E_OK;
00538     i_unlock_cpu();
00539 
00540   error_exit:
00541     LOG_IFSND_DTQ_LEAVE(ercd);
00542     return(ercd);
00543 }

ER ini_dtq ( ID  dtqid  ) 

dataqueue.c686 行で定義されています。

参照先 CHECK_DTQID, CHECK_TSKCTX_UNL, dataqueue_control_block::count, dispatch, E_OK, get_dtqcb, dataqueue_control_block::head, init_wait_queue, LOG_INI_DTQ_ENTER, LOG_INI_DTQ_LEAVE, dataqueue_control_block::rwait_queue, dataqueue_control_block::swait_queue, t_lock_cpu, t_unlock_cpu, と dataqueue_control_block::tail.

00687 {
00688     DTQCB   *p_dtqcb;
00689     bool_t  dspreq;
00690     ER      ercd;
00691     
00692     LOG_INI_DTQ_ENTER(dtqid);
00693     CHECK_TSKCTX_UNL();
00694     CHECK_DTQID(dtqid);
00695     p_dtqcb = get_dtqcb(dtqid);
00696 
00697     t_lock_cpu();
00698     dspreq = init_wait_queue(&(p_dtqcb->swait_queue));
00699     if (init_wait_queue(&(p_dtqcb->rwait_queue))) {
00700         dspreq = true;
00701     };
00702     p_dtqcb->count = 0U;
00703     p_dtqcb->head = 0U;
00704     p_dtqcb->tail = 0U;
00705     if (dspreq) {
00706         dispatch();
00707     }
00708     ercd = E_OK;
00709     t_unlock_cpu();
00710 
00711   error_exit:
00712     LOG_INI_DTQ_LEAVE(ercd);
00713     return(ercd);
00714 }

void initialize_dataqueue ( void   ) 

dataqueue.c161 行で定義されています。

参照先 dataqueue_control_block::count, dtqcb_table, dtqinib_table, dataqueue_control_block::head, dataqueue_control_block::p_dtqinib, queue_initialize(), dataqueue_control_block::rwait_queue, dataqueue_control_block::swait_queue, dataqueue_control_block::tail, と tnum_dtq.

00162 {
00163     uint_t  i;
00164     DTQCB   *p_dtqcb;
00165 
00166     for (p_dtqcb = dtqcb_table, i = 0; i < tnum_dtq; p_dtqcb++, i++) {
00167         queue_initialize(&(p_dtqcb->swait_queue));
00168         p_dtqcb->p_dtqinib = &(dtqinib_table[i]);
00169         queue_initialize(&(p_dtqcb->rwait_queue));
00170         p_dtqcb->count = 0U;
00171         p_dtqcb->head = 0U;
00172         p_dtqcb->tail = 0U;
00173     }
00174 }

ER ipsnd_dtq ( ID  dtqid,
intptr_t  data 
)

dataqueue.c408 行で定義されています。

参照先 CHECK_DTQID, CHECK_INTCTX_UNL, E_OK, E_TMOUT, get_dtqcb, i_lock_cpu, i_unlock_cpu, LOG_IPSND_DTQ_ENTER, LOG_IPSND_DTQ_LEAVE, reqflg, と send_data.

00409 {
00410     DTQCB   *p_dtqcb;
00411     bool_t  reqdsp;
00412     ER      ercd;
00413 
00414     LOG_IPSND_DTQ_ENTER(dtqid, data);
00415     CHECK_INTCTX_UNL();
00416     CHECK_DTQID(dtqid);
00417     p_dtqcb = get_dtqcb(dtqid);
00418 
00419     i_lock_cpu();
00420     if (send_data(p_dtqcb, data, &reqdsp)) {
00421         if (reqdsp) {
00422             reqflg = true;
00423         }
00424         ercd = E_OK;
00425     }
00426     else {
00427         ercd = E_TMOUT;
00428     }
00429     i_unlock_cpu();
00430 
00431   error_exit:
00432     LOG_IPSND_DTQ_LEAVE(ercd);
00433     return(ercd);
00434 }

ER prcv_dtq ( ID  dtqid,
intptr_t *  p_data 
)

dataqueue.c599 行で定義されています。

参照先 CHECK_DTQID, CHECK_TSKCTX_UNL, dispatch, E_OK, E_TMOUT, get_dtqcb, LOG_PRCV_DTQ_ENTER, LOG_PRCV_DTQ_LEAVE, receive_data, t_lock_cpu, と t_unlock_cpu.

00600 {
00601     DTQCB   *p_dtqcb;
00602     bool_t  reqdsp;
00603     ER      ercd;
00604 
00605     LOG_PRCV_DTQ_ENTER(dtqid, p_data);
00606     CHECK_TSKCTX_UNL();
00607     CHECK_DTQID(dtqid);
00608     p_dtqcb = get_dtqcb(dtqid);
00609 
00610     t_lock_cpu();
00611     if (receive_data(p_dtqcb, p_data, &reqdsp)) {
00612         if (reqdsp) {
00613             dispatch();
00614         }
00615         ercd = E_OK;
00616     }
00617     else {
00618         ercd = E_TMOUT;
00619     }
00620     t_unlock_cpu();
00621 
00622   error_exit:
00623     LOG_PRCV_DTQ_LEAVE(ercd, *p_data);
00624     return(ercd);
00625 }

ER psnd_dtq ( ID  dtqid,
intptr_t  data 
)

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

参照先 CHECK_DTQID, CHECK_TSKCTX_UNL, dispatch, E_OK, E_TMOUT, get_dtqcb, LOG_PSND_DTQ_ENTER, LOG_PSND_DTQ_LEAVE, send_data, t_lock_cpu, と t_unlock_cpu.

00373 {
00374     DTQCB   *p_dtqcb;
00375     bool_t  reqdsp;
00376     ER      ercd;
00377 
00378     LOG_PSND_DTQ_ENTER(dtqid, data);
00379     CHECK_TSKCTX_UNL();
00380     CHECK_DTQID(dtqid);
00381     p_dtqcb = get_dtqcb(dtqid);
00382 
00383     t_lock_cpu();
00384     if (send_data(p_dtqcb, data, &reqdsp)) {
00385         if (reqdsp) {
00386             dispatch();
00387         }
00388         ercd = E_OK;
00389     }
00390     else {
00391         ercd = E_TMOUT;
00392     }
00393     t_unlock_cpu();
00394 
00395   error_exit:
00396     LOG_PSND_DTQ_LEAVE(ercd);
00397     return(ercd);
00398 }

ER rcv_dtq ( ID  dtqid,
intptr_t *  p_data 
)

dataqueue.c553 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_DTQID, dispatch, E_OK, get_dtqcb, LOG_RCV_DTQ_ENTER, LOG_RCV_DTQ_LEAVE, LOG_TSKSTAT, make_wait(), p_runtsk, queue_insert_prev(), receive_data, dataqueue_control_block::rwait_queue, t_lock_cpu, t_unlock_cpu, TS_WAIT_RDTQ, TS_WAITING, と waiting_information::wercd.

00554 {
00555     DTQCB   *p_dtqcb;
00556     WINFO_DTQ winfo_dtq;
00557     bool_t  reqdsp;
00558     ER      ercd;
00559 
00560     LOG_RCV_DTQ_ENTER(dtqid, p_data);
00561     CHECK_DISPATCH();
00562     CHECK_DTQID(dtqid);
00563     p_dtqcb = get_dtqcb(dtqid);
00564 
00565     t_lock_cpu();
00566     if (receive_data(p_dtqcb, p_data, &reqdsp)) {
00567         if (reqdsp) {
00568             dispatch();
00569         }
00570         ercd = E_OK;
00571     }
00572     else {
00573         p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
00574         make_wait((WINFO *) &winfo_dtq);
00575         queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
00576         winfo_dtq.p_dtqcb = p_dtqcb;
00577         LOG_TSKSTAT(p_runtsk);
00578         dispatch();
00579         ercd = winfo_dtq.winfo.wercd;
00580         if (ercd == E_OK) {
00581             *p_data = winfo_dtq.data;
00582         }
00583     }
00584     t_unlock_cpu();
00585 
00586   error_exit:
00587     LOG_RCV_DTQ_LEAVE(ercd, *p_data);
00588     return(ercd);
00589 }

bool_t receive_data ( DTQCB p_dtqcb,
intptr_t *  p_data,
bool_t p_reqdsp 
)

dataqueue.c294 行で定義されています。

参照先 dataqueue_control_block::count, dequeue_data, enqueue_data, task_control_block::p_winfo, queue_delete_next(), queue_empty(), dataqueue_control_block::swait_queue, と wait_complete.

00295 {
00296     TCB     *p_tcb;
00297     intptr_t data;
00298 
00299     if (p_dtqcb->count > 0U) {
00300         dequeue_data(p_dtqcb, p_data);
00301         if (!queue_empty(&(p_dtqcb->swait_queue))) {
00302             p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
00303             data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
00304             enqueue_data(p_dtqcb, data);
00305             *p_reqdsp = wait_complete(p_tcb);
00306         }
00307         else {
00308             *p_reqdsp = false;
00309         }
00310         return(true);
00311     }
00312     else if (!queue_empty(&(p_dtqcb->swait_queue))) {
00313         p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->swait_queue));
00314         *p_data = ((WINFO_DTQ *)(p_tcb->p_winfo))->data;
00315         *p_reqdsp = wait_complete(p_tcb);
00316         return(true);
00317     }
00318     else {
00319         return(false);
00320     }
00321 }

ER ref_dtq ( ID  dtqid,
T_RDTQ pk_rdtq 
)

dataqueue.c724 行で定義されています。

参照先 CHECK_DTQID, CHECK_TSKCTX_UNL, dataqueue_control_block::count, E_OK, get_dtqcb, LOG_REF_DTQ_ENTER, LOG_REF_DTQ_LEAVE, t_rdtq::rtskid, dataqueue_control_block::rwait_queue, t_rdtq::sdtqcnt, t_rdtq::stskid, dataqueue_control_block::swait_queue, t_lock_cpu, t_unlock_cpu, と wait_tskid().

00725 {
00726     DTQCB   *p_dtqcb;
00727     ER      ercd;
00728     
00729     LOG_REF_DTQ_ENTER(dtqid, pk_rdtq);
00730     CHECK_TSKCTX_UNL();
00731     CHECK_DTQID(dtqid);
00732     p_dtqcb = get_dtqcb(dtqid);
00733 
00734     t_lock_cpu();
00735     pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue));
00736     pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue));
00737     pk_rdtq->sdtqcnt = p_dtqcb->count;
00738     ercd = E_OK;
00739     t_unlock_cpu();
00740 
00741   error_exit:
00742     LOG_REF_DTQ_LEAVE(ercd, pk_rdtq);
00743     return(ercd);
00744 }

bool_t send_data ( DTQCB p_dtqcb,
intptr_t  data,
bool_t p_reqdsp 
)

dataqueue.c243 行で定義されています。

参照先 dataqueue_control_block::count, dataqueue_initialization_block::dtqcnt, enqueue_data, dataqueue_control_block::p_dtqinib, task_control_block::p_winfo, queue_delete_next(), queue_empty(), dataqueue_control_block::rwait_queue, と wait_complete.

00244 {
00245     TCB     *p_tcb;
00246 
00247     if (!queue_empty(&(p_dtqcb->rwait_queue))) {
00248         p_tcb = (TCB *) queue_delete_next(&(p_dtqcb->rwait_queue));
00249         ((WINFO_DTQ *)(p_tcb->p_winfo))->data = data;
00250         *p_reqdsp = wait_complete(p_tcb);
00251         return(true);
00252     }
00253     else if (p_dtqcb->count < p_dtqcb->p_dtqinib->dtqcnt) {
00254         enqueue_data(p_dtqcb, data);
00255         *p_reqdsp = false;
00256         return(true);
00257     }
00258     else {
00259         return(false);
00260     }
00261 }

ER snd_dtq ( ID  dtqid,
intptr_t  data 
)

dataqueue.c331 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_DTQID, dataqueue_waiting_information::data, dispatch, E_OK, get_dtqcb, LOG_SND_DTQ_ENTER, LOG_SND_DTQ_LEAVE, p_runtsk, send_data, t_lock_cpu, t_unlock_cpu, TS_WAIT_SDTQ, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait.

00332 {
00333     DTQCB   *p_dtqcb;
00334     WINFO_DTQ winfo_dtq;
00335     bool_t  reqdsp;
00336     ER      ercd;
00337 
00338     LOG_SND_DTQ_ENTER(dtqid, data);
00339     CHECK_DISPATCH();
00340     CHECK_DTQID(dtqid);
00341     p_dtqcb = get_dtqcb(dtqid);
00342 
00343     t_lock_cpu();
00344     if (send_data(p_dtqcb, data, &reqdsp)) {
00345         if (reqdsp) {
00346             dispatch();
00347         }
00348         ercd = E_OK;
00349     }
00350     else {
00351         winfo_dtq.data = data;
00352         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
00353         wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq);
00354         dispatch();
00355         ercd = winfo_dtq.winfo.wercd;
00356     }
00357     t_unlock_cpu();
00358 
00359   error_exit:
00360     LOG_SND_DTQ_LEAVE(ercd);
00361     return(ercd);
00362 }

ER trcv_dtq ( ID  dtqid,
intptr_t *  p_data,
TMO  tmout 
)

dataqueue.c635 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_DTQID, CHECK_TMOUT, dispatch, E_OK, E_TMOUT, get_dtqcb, LOG_TRCV_DTQ_ENTER, LOG_TRCV_DTQ_LEAVE, LOG_TSKSTAT, make_wait_tmout, p_runtsk, queue_insert_prev(), receive_data, dataqueue_control_block::rwait_queue, t_lock_cpu, t_unlock_cpu, TMO_POL, TS_WAIT_RDTQ, TS_WAITING, と waiting_information::wercd.

00636 {
00637     DTQCB   *p_dtqcb;
00638     WINFO_DTQ winfo_dtq;
00639     TMEVTB  tmevtb;
00640     bool_t  reqdsp;
00641     ER      ercd;
00642 
00643     LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout);
00644     CHECK_DISPATCH();
00645     CHECK_DTQID(dtqid);
00646     CHECK_TMOUT(tmout);
00647     p_dtqcb = get_dtqcb(dtqid);
00648 
00649     t_lock_cpu();
00650     if (receive_data(p_dtqcb, p_data, &reqdsp)) {
00651         if (reqdsp) {
00652             dispatch();
00653         }
00654         ercd = E_OK;
00655     }
00656     else if (tmout == TMO_POL) {
00657         ercd = E_TMOUT;
00658     }
00659     else {
00660         p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ);
00661         make_wait_tmout((WINFO *) &winfo_dtq, &tmevtb, tmout);
00662         queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue));
00663         winfo_dtq.p_dtqcb = p_dtqcb;
00664         LOG_TSKSTAT(p_runtsk);
00665         dispatch();
00666         ercd = winfo_dtq.winfo.wercd;
00667         if (ercd == E_OK) {
00668             *p_data = winfo_dtq.data;
00669         }
00670     }
00671     t_unlock_cpu();
00672 
00673   error_exit:
00674     LOG_TRCV_DTQ_LEAVE(ercd, *p_data);
00675     return(ercd);
00676 }

ER tsnd_dtq ( ID  dtqid,
intptr_t  data,
TMO  tmout 
)

dataqueue.c444 行で定義されています。

参照先 CHECK_DISPATCH, CHECK_DTQID, CHECK_TMOUT, dataqueue_waiting_information::data, dispatch, E_OK, E_TMOUT, get_dtqcb, LOG_TSND_DTQ_ENTER, LOG_TSND_DTQ_LEAVE, p_runtsk, send_data, t_lock_cpu, t_unlock_cpu, TMO_POL, TS_WAIT_SDTQ, TS_WAITING, waiting_information::wercd, wait_object_waiting_information::winfo, と wobj_make_wait_tmout.

00445 {
00446     DTQCB   *p_dtqcb;
00447     WINFO_DTQ winfo_dtq;
00448     TMEVTB  tmevtb;
00449     bool_t  reqdsp;
00450     ER      ercd;
00451 
00452     LOG_TSND_DTQ_ENTER(dtqid, data, tmout);
00453     CHECK_DISPATCH();
00454     CHECK_DTQID(dtqid);
00455     CHECK_TMOUT(tmout);
00456     p_dtqcb = get_dtqcb(dtqid);
00457 
00458     t_lock_cpu();
00459     if (send_data(p_dtqcb, data, &reqdsp)) {
00460         if (reqdsp) {
00461             dispatch();
00462         }
00463         ercd = E_OK;
00464     }
00465     else if (tmout == TMO_POL) {
00466         ercd = E_TMOUT;
00467     }
00468     else {
00469         winfo_dtq.data = data;
00470         p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ);
00471         wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq,
00472                                                         &tmevtb, tmout);
00473         dispatch();
00474         ercd = winfo_dtq.winfo.wercd;
00475     }
00476     t_unlock_cpu();
00477 
00478   error_exit:
00479     LOG_TSND_DTQ_LEAVE(ercd);
00480     return(ercd);
00481 }


Copyright © 2008 by Kijineko Inc.

ホームページ制作