A seguir: Solução Marco Antônio, receive Acima: Questão 2 - 9 Anterior: Questão 2 - 9
- Inserir no núcleo os métodos:
// Envia mensagem m para processo dest. Primitiva N\~{A}O BLOQUEANTE.
// Ao chamar send() eh enviada diretamente pro receptor (se este
// ja estiver esperando) ou bufferizada.
public void send (Process dest, Message m) {
// Salva contexto e desabilita interrup\c{c}\~{o}es
InterruptStatus is = saveInterruptStatus();
disableInterrupts();
if (CurrentProcess.waitingForSend.belongs(dest)) {
// Se processo destino ja esta esperando por mensagem do
// processo corrente:
// 1 - copia esta mensagem para destino
dest.msg = m.Clone();
// 2 - desbloqueia destino
ready.put(dest);
dest.state = READY;
// 3 - Retira primeira ocorrencia do processo destino
// da fila de mensagens a enviar pendentes
CurrentProcess.waitingForSend.extract(dest);
} else {
// Se processo destino n\~{a}o esta esperando mensagens do
// processo corrente:
// 1 - insere mensagens na fila de mensagens do processo
// destino
dest.waitingForReceive.put(CurrentProcess, m);
}
// Restaura contexto
is.restore();
}