ER ipsnd_dtq(ID dtqid, intptr_t data) { DTQCB *p_dtqcb; bool_t reqdsp; ER ercd; LOG_IPSND_DTQ_ENTER(dtqid, data); CHECK_INTCTX_UNL(); CHECK_DTQID(dtqid); p_dtqcb = get_dtqcb(dtqid); i_lock_cpu(); if (send_data(p_dtqcb, data, &reqdsp)) { if (reqdsp) { reqflg = true; } ercd = E_OK; } else { ercd = E_TMOUT; } i_unlock_cpu(); error_exit: LOG_IPSND_DTQ_LEAVE(ercd); return(ercd); }
ER ini_dtq(ID dtqid) { DTQCB *p_dtqcb; bool_t dspreq; ER ercd; LOG_INI_DTQ_ENTER(dtqid); CHECK_TSKCTX_UNL(); CHECK_DTQID(dtqid); p_dtqcb = get_dtqcb(dtqid); t_lock_cpu(); dspreq = init_wait_queue(&(p_dtqcb->swait_queue)); if (init_wait_queue(&(p_dtqcb->rwait_queue))) { dspreq = true; }; p_dtqcb->count = 0U; p_dtqcb->head = 0U; p_dtqcb->tail = 0U; if (dspreq) { dispatch(); } ercd = E_OK; t_unlock_cpu(); error_exit: LOG_INI_DTQ_LEAVE(ercd); return(ercd); }
ER prcv_dtq(ID dtqid, intptr_t *p_data) { DTQCB *p_dtqcb; bool_t reqdsp; ER ercd; LOG_PRCV_DTQ_ENTER(dtqid, p_data); CHECK_TSKCTX_UNL(); CHECK_DTQID(dtqid); p_dtqcb = get_dtqcb(dtqid); t_lock_cpu(); if (receive_data(p_dtqcb, p_data, &reqdsp)) { if (reqdsp) { dispatch(); } ercd = E_OK; } else { ercd = E_TMOUT; } t_unlock_cpu(); error_exit: LOG_PRCV_DTQ_LEAVE(ercd, *p_data); return(ercd); }
ER snd_dtq(ID dtqid, intptr_t data) { DTQCB *p_dtqcb; WINFO_DTQ winfo_dtq; bool_t reqdsp; ER ercd; LOG_SND_DTQ_ENTER(dtqid, data); CHECK_DISPATCH(); CHECK_DTQID(dtqid); p_dtqcb = get_dtqcb(dtqid); t_lock_cpu(); if (send_data(p_dtqcb, data, &reqdsp)) { if (reqdsp) { dispatch(); } ercd = E_OK; } else { winfo_dtq.data = data; p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ); wobj_make_wait((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq); dispatch(); ercd = winfo_dtq.winfo.wercd; } t_unlock_cpu(); error_exit: LOG_SND_DTQ_LEAVE(ercd); return(ercd); }
ER trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout) { DTQCB *p_dtqcb; WINFO_DTQ winfo_dtq; TMEVTB tmevtb; bool_t reqdsp; ER ercd; LOG_TRCV_DTQ_ENTER(dtqid, p_data, tmout); CHECK_DISPATCH(); CHECK_DTQID(dtqid); CHECK_TMOUT(tmout); p_dtqcb = get_dtqcb(dtqid); t_lock_cpu(); if (receive_data(p_dtqcb, p_data, &reqdsp)) { if (reqdsp) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { p_runtsk->tstat = (TS_WAITING | TS_WAIT_RDTQ); make_wait_tmout(&(winfo_dtq.winfo), &tmevtb, tmout); queue_insert_prev(&(p_dtqcb->rwait_queue), &(p_runtsk->task_queue)); winfo_dtq.p_dtqcb = p_dtqcb; LOG_TSKSTAT(p_runtsk); dispatch(); ercd = winfo_dtq.winfo.wercd; if (ercd == E_OK) { *p_data = winfo_dtq.data; } } t_unlock_cpu(); error_exit: LOG_TRCV_DTQ_LEAVE(ercd, *p_data); return(ercd); }
ER del_dtq(ID dtqid) { DTQCB *p_dtqcb; DTQINIB *p_dtqinib; bool_t dspreq; ER ercd; LOG_DEL_DTQ_ENTER(dtqid); CHECK_TSKCTX_UNL(); CHECK_DTQID(dtqid); p_dtqcb = get_dtqcb(dtqid); t_lock_cpu(); if (p_dtqcb->p_dtqinib->dtqatr == TA_NOEXS) { ercd = E_NOEXS; } else if (DTQID(p_dtqcb) > tmax_sdtqid) { dspreq = init_wait_queue(&(p_dtqcb->swait_queue)); if (init_wait_queue(&(p_dtqcb->rwait_queue))) { dspreq = true; } p_dtqinib = (DTQINIB *)(p_dtqcb->p_dtqinib); if ((p_dtqinib->dtqatr & TA_MBALLOC) != 0U) { kernel_free(p_dtqinib->p_dtqmb); } p_dtqinib->dtqatr = TA_NOEXS; queue_insert_prev(&free_dtqcb, &(p_dtqcb->swait_queue)); if (dspreq) { dispatch(); } ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_DEL_DTQ_LEAVE(ercd); return(ercd); }
ER ref_dtq(ID dtqid, T_RDTQ *pk_rdtq) { DTQCB *p_dtqcb; ER ercd; LOG_REF_DTQ_ENTER(dtqid, pk_rdtq); CHECK_TSKCTX_UNL(); CHECK_DTQID(dtqid); p_dtqcb = get_dtqcb(dtqid); t_lock_cpu(); pk_rdtq->stskid = wait_tskid(&(p_dtqcb->swait_queue)); pk_rdtq->rtskid = wait_tskid(&(p_dtqcb->rwait_queue)); pk_rdtq->sdtqcnt = p_dtqcb->count; ercd = E_OK; t_unlock_cpu(); error_exit: LOG_REF_DTQ_LEAVE(ercd, pk_rdtq); return(ercd); }
ER tsnd_dtq(ID dtqid, intptr_t data, TMO tmout) { DTQCB *p_dtqcb; WINFO_DTQ winfo_dtq; TMEVTB tmevtb; bool_t reqdsp; ER ercd; LOG_TSND_DTQ_ENTER(dtqid, data, tmout); CHECK_DISPATCH(); CHECK_DTQID(dtqid); CHECK_TMOUT(tmout); p_dtqcb = get_dtqcb(dtqid); t_lock_cpu(); if (send_data(p_dtqcb, data, &reqdsp)) { if (reqdsp) { dispatch(); } ercd = E_OK; } else if (tmout == TMO_POL) { ercd = E_TMOUT; } else { winfo_dtq.data = data; p_runtsk->tstat = (TS_WAITING | TS_WAIT_SDTQ); wobj_make_wait_tmout((WOBJCB *) p_dtqcb, (WINFO_WOBJ *) &winfo_dtq, &tmevtb, tmout); dispatch(); ercd = winfo_dtq.winfo.wercd; } t_unlock_cpu(); error_exit: LOG_TSND_DTQ_LEAVE(ercd); return(ercd); }
ER ifsnd_dtq(ID dtqid, intptr_t data) { DTQCB *p_dtqcb; ER ercd; LOG_IFSND_DTQ_ENTER(dtqid, data); CHECK_INTCTX_UNL(); CHECK_DTQID(dtqid); p_dtqcb = get_dtqcb(dtqid); CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U); i_lock_cpu(); if (force_send_data(p_dtqcb, data)) { reqflg = true; } ercd = E_OK; i_unlock_cpu(); error_exit: LOG_IFSND_DTQ_LEAVE(ercd); return(ercd); }
ER fsnd_dtq(ID dtqid, intptr_t data) { DTQCB *p_dtqcb; ER ercd; LOG_FSND_DTQ_ENTER(dtqid, data); CHECK_TSKCTX_UNL(); CHECK_DTQID(dtqid); p_dtqcb = get_dtqcb(dtqid); CHECK_ILUSE(p_dtqcb->p_dtqinib->dtqcnt > 0U); t_lock_cpu(); if (force_send_data(p_dtqcb, data)) { dispatch(); } ercd = E_OK; t_unlock_cpu(); error_exit: LOG_FSND_DTQ_LEAVE(ercd); return(ercd); }