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; }
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; }
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; }
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; }
int k_release_processor() { proc_pq_enqueue(ready_pq, current_process); k_process_switch(P_READY); return CODE_SUCCESS; }