Ejemplo n.º 1
0
int k_release_processor(){
	PCB * pcb = kernel->current_process;
	if(pcb == NULL)
		return 1;
	if(pcb->id != NULL_PID){
		pcb->state = READY;
		enPQ(kernel->rq, pcb, pcb->priority);
	}
	k_atomic(off);
	k_process_switch();
	return 0;
}
Ejemplo n.º 2
0
MsgEnv * k_request_msg_env()
{
    while (msg_env_queue_is_empty(free_env_q))
    {
        if (current_process->is_i_process)
        {
            return NULL;
        }
        proc_pq_enqueue(env_blocked_pq, current_process);
        k_process_switch(P_BLOCKED_ON_ENV_REQUEST);
    }

    MsgEnv *env = msg_env_queue_dequeue(free_env_q);
    return env;
}
Ejemplo n.º 3
0
MsgEnv * k_request_msg_env (){
	MsgEnv * env = kernel->availMsgEnvQueue->nextMsgEnv;
	while (!env){ // For user processes its messing up here for some reason....
		PCB * pcb = kernel->current_process;
		// Process becomes blocked on envelope_request
		if(pcb->state == IS_IPROCESS){ return NULL;}
			pcb->state = BLOCK_ON_ENV;
			enPQ(kernel->bq, pcb, pcb->priority);
			k_process_switch();
			env = kernel->availMsgEnvQueue->nextMsgEnv;

	}
		kernel->availMsgEnvQueue->nextMsgEnv = kernel->availMsgEnvQueue->nextMsgEnv->nextMsgEnv;
		env->nextMsgEnv = NULL;
		//clear message
		memset(env->msg, 0, MSG_SIZE);
	return env;
}
Ejemplo n.º 4
0
MsgEnv * k_receive_message(){
	PCB * pcb = kernel->current_process;

	while(pcb->msgEnvQueue == NULL){
		if(pcb->state != IS_IPROCESS){
			pcb->state = BLOCK_ON_RCV;
			//enPQ(kernel->bq, pcb, pcb->priority);
			k_process_switch();
		}else{
			return NULL;
		}

	}
	MsgEnv * result = pcb->msgEnvQueue;
	pcb->msgEnvQueue = result->nextMsgEnv;
	result->nextMsgEnv = NULL;
	enTraceBuf(kernel->firstReceived, result);
	return result;
}
Ejemplo n.º 5
0
int k_release_processor()
{
    proc_pq_enqueue(ready_pq, current_process);
    k_process_switch(P_READY);
    return CODE_SUCCESS;
}