#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.c の 138 行で定義されています。
参照元 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.c の 137 行で定義されています。
#define LOG_INI_PDQ_ENTER | ( | pdqid | ) |
#define LOG_INI_PDQ_LEAVE | ( | ercd | ) |
#define LOG_IPSND_PDQ_ENTER | ( | pdqid, | |||
data, | |||||
datapri | ) |
#define LOG_IPSND_PDQ_LEAVE | ( | ercd | ) |
#define LOG_PRCV_PDQ_ENTER | ( | pdqid, | |||
p_data, | |||||
p_datapri | ) |
#define LOG_PRCV_PDQ_LEAVE | ( | ercd, | |||
data, | |||||
datapri | ) |
#define LOG_PSND_PDQ_ENTER | ( | pdqid, | |||
data, | |||||
datapri | ) |
#define LOG_PSND_PDQ_LEAVE | ( | ercd | ) |
#define LOG_RCV_PDQ_ENTER | ( | pdqid, | |||
p_data, | |||||
p_datapri | ) |
#define LOG_RCV_PDQ_LEAVE | ( | ercd, | |||
data, | |||||
datapri | ) |
#define LOG_REF_PDQ_ENTER | ( | pdqid, | |||
pk_rpdq | ) |
#define LOG_REF_PDQ_LEAVE | ( | ercd, | |||
pk_rpdq | ) |
#define LOG_SND_PDQ_ENTER | ( | pdqid, | |||
data, | |||||
datapri | ) |
#define LOG_SND_PDQ_LEAVE | ( | ercd | ) |
#define LOG_TRCV_PDQ_ENTER | ( | pdqid, | |||
p_data, | |||||
p_datapri, | |||||
tmout | ) |
#define LOG_TRCV_PDQ_LEAVE | ( | ercd, | |||
data, | |||||
datapri | ) |
#define LOG_TSND_PDQ_ENTER | ( | pdqid, | |||
data, | |||||
datapri, | |||||
tmout | ) |
#define LOG_TSND_PDQ_LEAVE | ( | ercd | ) |
#define tnum_pdq ((uint_t)(tmax_pdqid - TMIN_PDQID + 1)) |
pridataq.c の 207 行で定義されています。
参照先 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 }
pridataq.c の 170 行で定義されています。
参照先 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 }
pridataq.c の 601 行で定義されています。
参照先 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.c の 146 行で定義されています。
参照先 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 }
pridataq.c の 380 行で定義されています。
参照先 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 }
pridataq.c の 513 行で定義されています。
参照先 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 }
pridataq.c の 343 行で定義されています。
参照先 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 }
pridataq.c の 466 行で定義されています。
参照先 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 }
pridataq.c の 259 行で定義されています。
参照先 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 }
pridataq.c の 640 行で定義されています。
参照先 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 }
pridataq.c の 230 行で定義されています。
参照先 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 }
pridataq.c の 300 行で定義されています。
参照先 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 }
pridataq.c の 549 行で定義されています。
参照先 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 }
pridataq.c の 417 行で定義されています。
参照先 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.