A seguir: Erros Acima: Questão 2 - 9 Anterior: Solução (Marco Antônio)
Recebe mensagem m do processo origem. Primitiva BLOQUEANTE. Ao chamar receive() a execução do programa eh interrompida ate que uma mensagem esteja disponivel.
public void receive (Process origem, Message m) {
// Salva contexto e desabilita interrup\c{c}\~{o}es
InterruptStatus is = saveInterruptStatus();
disableInterrupts();
if (CurrentProcess.waitingForReceive.belongs(origem)) {
// Se mensagem do processo origem ja esta no buffer de
// mensagens recebidas do processo corrente:
// 1 - obtem esta mensagem e coloca em m
m = CurrentProcess.waitingForReceive.obtemMensagem(origem);
// 2 - extrai essa mensagem (associada aa primeira ocorrencia
// do processo origem) do buffer de mensagens recebidas
CurrentProcess.waitingForSend.extract(origem);
} else {
// Se processo origem ainda n\~{a}o enviou mensagem para processo
// corrente
// 1 - insere id na fila de envios pendentes do processo
// origem para que este saiba que CurrentProcess ja esta
// esperando mensagem
origem.waitingForSend.put(CurrentProcess);
// 2 - Muda seu estado para bloqueado ate que processo origem
// o desbloqueie
CurrentProcess.state = IOBLOCKED;
// 3 - Transfere execu\c{c}\~{a}o pro nucleo
transfer(CurrentProcess.Coroutine, Kernel);
}
// Restaura contexto
is.restore();
}