Exemple #1
0
ER
ena_dsp(void)
{
	ER		ercd;
	bool_t dspreq = false;
	PCB		*my_p_pcb;

	LOG_ENA_DSP_ENTER();
	CHECK_TSKCTX_UNL();

	t_lock_cpu();
	my_p_pcb = t_acquire_tsk_lock_self_without_runnable_check();
	my_p_pcb->disdsp = false;
	if (t_get_ipm() == TIPM_ENAALL) {
		my_p_pcb->dspflg = true;
		if (my_p_pcb->p_runtsk != my_p_pcb->p_schedtsk) {
			dspreq = true;
		}
	}
	ercd = E_OK;
	release_tsk_lock(my_p_pcb);
	if (dspreq) {
		dispatch();
	}
	t_unlock_cpu();

  error_exit:
	LOG_ENA_DSP_LEAVE(ercd);
	return(ercd);
}
ER
ext_tsk(void)
{
	ER		ercd;

	LOG_EXT_TSK_ENTER();
	CHECK_TSKCTX();

	if (t_sense_lock()) {
		/*
		 *  CPUロック状態でext_tskが呼ばれた場合は,CPUロックを解除し
		 *  てからタスクを終了する.実装上は,サービスコール内でのCPU
		 *  ロックを省略すればよいだけ.
		 */
	}
	else {
		t_lock_cpu();
	}
	if (disdsp) {
		/*
		 *  ディスパッチ禁止状態でext_tskが呼ばれた場合は,ディスパッ
		 *  チ許可状態にしてからタスクを終了する.
		 */
		disdsp = false;
	}
	if (t_get_ipm() != TIPM_ENAALL) {
		/*
		 *  割込み優先度マスク(IPM)がTIPM_ENAALL以外の状態でext_tsk
		 *  が呼ばれた場合は,IPMをTIPM_ENAALLにしてからタスクを終了す
		 *  る.
		 */
		t_set_ipm(TIPM_ENAALL);
	}
	dspflg = true;

	(void) make_non_runnable(p_runtsk);
	make_dormant(p_runtsk);
	if (p_runtsk->actque) {
		p_runtsk->actque = false;
		(void) make_active(p_runtsk);
	}
	exit_and_dispatch();
	return(E_SYS);

  error_exit:
	LOG_EXT_TSK_LEAVE(ercd);
	return(ercd);
}
Exemple #3
0
ER
get_ipm(PRI *p_intpri)
{
	ER		ercd;

	LOG_GET_IPM_ENTER(p_intpri);
	CHECK_TSKCTX_UNL();

	t_lock_cpu();
	*p_intpri = t_get_ipm();
	ercd = E_OK;
	t_unlock_cpu();

  error_exit:
	LOG_GET_IPM_LEAVE(ercd, *p_intpri);
	return(ercd);
}
Exemple #4
0
ER
get_ipm(PRI *p_intpri)
{
	ER		ercd;

	LOG_GET_IPM_ENTER(p_intpri);
	CHECK_TSKCTX_UNL();
	CHECK_MACV_WRITE(p_intpri, PRI);
	CHECK_ACPTN(sysstat_acvct.acptn4);

	t_lock_cpu();
	*p_intpri = t_get_ipm();
	ercd = E_OK;
	t_unlock_cpu();

  error_exit:
	LOG_GET_IPM_LEAVE(ercd, *p_intpri);
	return(ercd);
}
ER
get_ipm(PRI *p_intpri)
{
	bool_t	locked;
	ER		ercd;

	LOG_GET_IPM_ENTER(p_intpri);
	CHECK_TSKCTX();

	locked = t_sense_lock();
	if (!locked) {
		t_lock_cpu();
	}
	*p_intpri = t_get_ipm();
	ercd = E_OK;
	if (!locked) {
		t_unlock_cpu();
	}

  error_exit:
	LOG_GET_IPM_LEAVE(ercd, *p_intpri);
	return(ercd);
}