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

A seguir: Erros Acima: Questão 2 - 9 Anterior: Solução (Marco Antônio)


Solução Marco Antônio, receive

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



Osvaldo Carvalho