SYSCALL ER isig_sem(ID semid) { SEMCB *semcb; TCB *tcb; ER ercd; LOG_ISIG_SEM_ENTER(semid); CHECK_INTCTX_UNL(); CHECK_SEMID(semid); semcb = get_semcb(semid); i_lock_cpu(); if (!queue_empty(&(semcb->wait_queue))) { tcb = (TCB *) queue_delete_next(&(semcb->wait_queue)); if (wait_complete(tcb)) { reqflg = TRUE; } ercd = E_OK; } else if (semcb->semcnt < semcb->seminib->maxsem) { semcb->semcnt += 1; ercd = E_OK; } else { ercd = E_QOVR; } i_unlock_cpu(); exit: LOG_ISIG_SEM_LEAVE(ercd); return(ercd); }
ER isig_sem(ID semid) { SEMCB *p_semcb; TCB *p_tcb; ER ercd; LOG_ISIG_SEM_ENTER(semid); CHECK_INTCTX_UNL(); CHECK_SEMID(semid); p_semcb = get_semcb(semid); i_lock_cpu(); if (p_semcb->p_seminib->sematr == TA_NOEXS) { ercd = E_NOEXS; } else if (!queue_empty(&(p_semcb->wait_queue))) { p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue)); if (wait_complete(p_tcb)) { reqflg = true; } ercd = E_OK; } else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) { p_semcb->semcnt += 1; ercd = E_OK; } else { ercd = E_QOVR; } i_unlock_cpu(); error_exit: LOG_ISIG_SEM_LEAVE(ercd); return(ercd); }