Beispiel #1
0
ER
ref_sem(ID semid, T_RSEM *pk_rsem)
{
	SEMCB	*p_semcb;
	ER		ercd;
    
	LOG_REF_SEM_ENTER(semid, pk_rsem);
	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 {
		pk_rsem->wtskid = wait_tskid(&(p_semcb->wait_queue));
		pk_rsem->semcnt = p_semcb->semcnt;
		ercd = E_OK;
	}
	unlock_cpu();

  error_exit:
	LOG_REF_SEM_LEAVE(ercd, pk_rsem);
	return(ercd);
}
Beispiel #2
0
ER
ref_sem(ID semid, T_RSEM *pk_rsem)
{
    SEMCB	*p_semcb;
    ER		ercd;

    LOG_REF_SEM_ENTER(semid, pk_rsem);
    CHECK_TSKCTX_UNL();
    CHECK_SEMID(semid);
    CHECK_MACV_WRITE(pk_rsem, T_RSEM);
    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.acptn4)) {
        ercd = E_OACV;
    }
    else {
        pk_rsem->wtskid = wait_tskid(&(p_semcb->wait_queue));
        pk_rsem->semcnt = p_semcb->semcnt;
        ercd = E_OK;
    }
    t_unlock_cpu();

error_exit:
    LOG_REF_SEM_LEAVE(ercd, pk_rsem);
    return(ercd);
}