Ejemplo n.º 1
0
static int srp_exceeds_ceiling(struct task_struct* first,
			       struct srp* srp)
{
	return list_empty(&srp->ceiling) ||
	       get_rt_period(first) < system_ceiling(srp)->period ||
	       (get_rt_period(first) == system_ceiling(srp)->period &&
		first->pid < system_ceiling(srp)->pid) ||
		ceiling2sem(system_ceiling(srp))->owner == first;
}
Ejemplo n.º 2
0
int8_t nrk_sem_post(nrk_sem_t *rsrc)
{
	int8_t id=nrk_get_resource_index(rsrc);	
	int8_t task_ID;
	if(id==-1) { _nrk_errno_set(1); return NRK_ERROR;}
	if(id==NRK_MAX_RESOURCE_CNT) { _nrk_errno_set(2); return NRK_ERROR; }

	if(nrk_sem_list[id].value<nrk_sem_list[id].count)
	{
		// Signal RSRC Event		
		nrk_int_disable();

		nrk_sem_list[id].value++;
		sc = system_ceiling();
		nrk_cur_task_TCB->elevated_prio_flag=0;

		for (task_ID=0; task_ID < NRK_MAX_TASKS; task_ID++){
			if(nrk_task_TCB[task_ID].event_suspend==RSRC_EVENT_SUSPENDED)
				if((nrk_task_TCB[task_ID].active_signal_mask == id))
				{
					nrk_task_TCB[task_ID].task_state=SUSPENDED;
					nrk_task_TCB[task_ID].next_wakeup=0;
					nrk_task_TCB[task_ID].event_suspend=0;
					nrk_task_TCB[task_ID].active_signal_mask=0;
				}   

		}
		nrk_int_enable();
	}
		
return NRK_OK;
}
Ejemplo n.º 3
0
int8_t nrk_sem_pend(nrk_sem_t *rsrc )
{
	int8_t id;
	id=nrk_get_resource_index(rsrc);  
	if(id==-1) { _nrk_errno_set(1); return NRK_ERROR;}
	if(id==NRK_MAX_RESOURCE_CNT) { _nrk_errno_set(2); return NRK_ERROR; }
	
	nrk_int_disable();
	if(nrk_sem_list[id].value==0)
	{
		nrk_cur_task_TCB->event_suspend|=RSRC_EVENT_SUSPENDED;
		nrk_cur_task_TCB->active_signal_mask=id;
		// Wait on suspend event
		nrk_int_enable();
		nrk_wait_until_ticks(0);
	}

	nrk_sem_list[id].value--;	
		sc = system_ceiling();
	nrk_cur_task_TCB->task_prio_ceil=nrk_sem_list[id].resource_ceiling;
	nrk_cur_task_TCB->elevated_prio_flag=1;
	nrk_int_enable();

	return NRK_OK;
}