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); }