#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)])) |
dataqueue.c の 153 行で定義されています。
参照元 fsnd_dtq(), ifsnd_dtq(), ini_dtq(), ipsnd_dtq(), prcv_dtq(), psnd_dtq(), rcv_dtq(), ref_dtq(), snd_dtq(), trcv_dtq(), と tsnd_dtq().
#define INDEX_DTQ | ( | dtqid | ) | ((uint_t)((dtqid) - TMIN_DTQID)) |
dataqueue.c の 152 行で定義されています。
#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_INI_DTQ_ENTER | ( | dtqid | ) |
#define LOG_INI_DTQ_LEAVE | ( | ercd | ) |
#define LOG_IPSND_DTQ_ENTER | ( | dtqid, | |||
data | ) |
#define LOG_IPSND_DTQ_LEAVE | ( | ercd | ) |
#define LOG_PRCV_DTQ_ENTER | ( | dtqid, | |||
p_data | ) |
#define LOG_PRCV_DTQ_LEAVE | ( | ercd, | |||
data | ) |
#define LOG_PSND_DTQ_ENTER | ( | dtqid, | |||
data | ) |
#define LOG_PSND_DTQ_LEAVE | ( | ercd | ) |
#define LOG_RCV_DTQ_ENTER | ( | dtqid, | |||
p_data | ) |
#define LOG_RCV_DTQ_LEAVE | ( | ercd, | |||
data | ) |
#define LOG_REF_DTQ_ENTER | ( | dtqid, | |||
pk_rdtq | ) |
#define LOG_REF_DTQ_LEAVE | ( | ercd, | |||
pk_rdtq | ) |
#define LOG_SND_DTQ_ENTER | ( | dtqid, | |||
data | ) |
#define LOG_SND_DTQ_LEAVE | ( | ercd | ) |
#define LOG_TRCV_DTQ_ENTER | ( | dtqid, | |||
p_data, | |||||
tmout | ) |
#define LOG_TRCV_DTQ_LEAVE | ( | ercd, | |||
data | ) |
#define LOG_TSND_DTQ_ENTER | ( | dtqid, | |||
data, | |||||
tmout | ) |
#define LOG_TSND_DTQ_LEAVE | ( | ercd | ) |
#define tnum_dtq ((uint_t)(tmax_dtqid - TMIN_DTQID + 1)) |
void dequeue_data | ( | DTQCB * | p_dtqcb, | |
intptr_t * | p_data | |||
) |
dataqueue.c の 225 行で定義されています。
参照先 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.c の 184 行で定義されています。
参照先 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.c の 202 行で定義されています。
参照先 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 }
dataqueue.c の 271 行で定義されています。
参照先 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 }
dataqueue.c の 491 行で定義されています。
参照先 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 }
dataqueue.c の 522 行で定義されています。
参照先 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 }
dataqueue.c の 686 行で定義されています。
参照先 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.c の 161 行で定義されています。
参照先 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 }
dataqueue.c の 408 行で定義されています。
参照先 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 }
dataqueue.c の 599 行で定義されています。
参照先 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 }
dataqueue.c の 372 行で定義されています。
参照先 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 }
dataqueue.c の 553 行で定義されています。
参照先 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 }
dataqueue.c の 294 行で定義されています。
参照先 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 }
dataqueue.c の 724 行で定義されています。
参照先 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 }
dataqueue.c の 243 行で定義されています。
参照先 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 }
dataqueue.c の 331 行で定義されています。
参照先 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 }
dataqueue.c の 635 行で定義されています。
参照先 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 }
dataqueue.c の 444 行で定義されています。
参照先 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.