ER ini_mtx(ID mtxid) { MTXCB *p_mtxcb; TCB *p_loctsk; bool_t dspreq; ER ercd; LOG_INI_MTX_ENTER(mtxid); CHECK_TSKCTX_UNL(); CHECK_MTXID(mtxid); p_mtxcb = get_mtxcb(mtxid); t_lock_cpu(); dspreq = init_wait_queue(&(p_mtxcb->wait_queue)); p_loctsk = p_mtxcb->p_loctsk; if (p_loctsk != NULL) { queue_delete(&(p_mtxcb->mutex_queue)); p_mtxcb->p_loctsk = NULL; if (MTX_CEILING(p_mtxcb)) { if (mutex_drop_priority(p_loctsk, p_mtxcb->p_mtxinib->ceilpri)) { dspreq = true; } } } if (dspreq) { dispatch(); } ercd = E_OK; t_unlock_cpu(); error_exit: LOG_INI_MTX_LEAVE(ercd); return(ercd); }
ER ini_mtx(ID mtxid) { MTXCB *p_mtxcb, **pp_prevmtx; TCB *p_loctsk; ER ercd; LOG_INI_MTX_ENTER(mtxid); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_MTXID(mtxid)); p_mtxcb = get_mtxcb(mtxid); lock_cpu(); if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mtxcb->p_mtxinib->acvct.acptn3)) { ercd = E_OACV; } else { init_wait_queue(&(p_mtxcb->wait_queue)); p_loctsk = p_mtxcb->p_loctsk; if (p_loctsk != NULL) { p_mtxcb->p_loctsk = NULL; pp_prevmtx = &(p_loctsk->p_lastmtx); while (*pp_prevmtx != NULL) { if (*pp_prevmtx == p_mtxcb) { *pp_prevmtx = p_mtxcb->p_prevmtx; break; } pp_prevmtx = &((*pp_prevmtx)->p_prevmtx); } mutex_drop_priority(p_loctsk, p_mtxcb); } if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } unlock_cpu(); error_exit: LOG_INI_MTX_LEAVE(ercd); return(ercd); }
ER unl_mtx(ID mtxid) { MTXCB *p_mtxcb; bool_t dspreq = false; ER ercd; LOG_UNL_MTX_ENTER(mtxid); CHECK_TSKCTX_UNL(); CHECK_MTXID(mtxid); p_mtxcb = get_mtxcb(mtxid); t_lock_cpu(); if (p_mtxcb->p_loctsk != p_runtsk) { ercd = E_OBJ; } else { queue_delete(&(p_mtxcb->mutex_queue)); if (MTX_CEILING(p_mtxcb)) { if (mutex_drop_priority(p_runtsk, p_mtxcb->p_mtxinib->ceilpri)) { dspreq = true; } } if (mutex_release(p_mtxcb)) { dspreq = true; } if (dspreq) { dispatch(); } ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_UNL_MTX_LEAVE(ercd); return(ercd); }
ER unl_mtx(ID mtxid) { MTXCB *p_mtxcb; ER ercd; LOG_UNL_MTX_ENTER(mtxid); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_MTXID(mtxid)); p_mtxcb = get_mtxcb(mtxid); lock_cpu(); if (p_mtxcb->p_mtxinib->mtxatr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_mtxcb->p_mtxinib->acvct.acptn1)) { ercd = E_OACV; } else if (p_mtxcb != p_runtsk->p_lastmtx) { ercd = E_OBJ; } else { p_runtsk->p_lastmtx = p_mtxcb->p_prevmtx; mutex_drop_priority(p_runtsk, p_mtxcb); mutex_release(p_mtxcb); if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } unlock_cpu(); error_exit: LOG_UNL_MTX_LEAVE(ercd); return(ercd); }