ER del_sem(ID semid) { SEMCB *p_semcb; SEMINIB *p_seminib; ER ercd; LOG_DEL_SEM_ENTER(semid); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_SEMID(semid)); p_semcb = get_semcb(semid); lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (semid <= tmax_ssemid) { ercd = E_OBJ; } else { init_wait_queue(&(p_semcb->wait_queue)); p_seminib = (SEMINIB *)(p_semcb->p_seminib); p_seminib->sematr = TA_NOEXS; queue_insert_prev(&free_semcb, &(p_semcb->wait_queue)); if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } unlock_cpu(); error_exit: LOG_DEL_SEM_LEAVE(ercd); return(ercd); }
ER del_sem(ID semid) { SEMCB *p_semcb; SEMINIB *p_seminib; bool_t dspreq; ER ercd; LOG_DEL_SEM_ENTER(semid); CHECK_TSKCTX_UNL(); CHECK_SEMID(semid); p_semcb = get_semcb(semid); t_lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (VIOLATE_ACPTN(p_semcb->p_seminib->acvct.acptn3)) { ercd = E_OACV; } else if (SEMID(p_semcb) > tmax_ssemid) { dspreq = init_wait_queue(&(p_semcb->wait_queue)); p_seminib = (SEMINIB *)(p_semcb->p_seminib); p_seminib->sematr = TA_NOEXS; queue_insert_prev(&free_semcb, &(p_semcb->wait_queue)); if (dspreq) { dispatch(); } ercd = E_OK; } else { ercd = E_OBJ; } t_unlock_cpu(); error_exit: LOG_DEL_SEM_LEAVE(ercd); return(ercd); }