UFMG - Pós-graduação em Ciência da Computação - Programação Paralela

A seguir: Solução Marco Antônio, receive Acima: Questão 2 - 9 Anterior: Questão 2 - 9


Solução (Marco Antônio)

- 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();
  }



Osvaldo Carvalho