- - - - CENAPAD-MGCO

A seguir: 3a Questão Acima: Sidney Batista Filho Anterior: 1a. Questao


2a Questao

Clientes - carros:

CBridge Bridge;
...
Bridge.RequestPass(ProcessId, Destiny);
/* passa pela ponte */
Bridge.ReleasePass();

class CRequest {
  CDestiny Destiny;
  CBed Bed;
  CProcessId ProcessId;
}

class CBridge {
  Key Mutex;
  CDestiny DestinyNow; // East-> ,  West<-  or null
  CQueue Queue;

  void RequestPass(CProcessId ProcessId, CDestiny Destiny) {
    Lock(Mutex);
      CRequest Request = Queue.GetRequest(ProcessId, Destiny);
      while(((Destiny != DestinyNow) && (DestinyNow != null)) ||
            (!Queue.IsTheBest(Request))) {
        Wait(Request.Bed, Mutex);
      }
      DestinyNow = Destiny;
      Queue.Ok(Request);
      Wakeup(Queue.Top(Destiny).Bed, Mutex);
    Unlock(Mutex);
  }

  void ReleasePass() {
    Lock(Mutex);
      if (Queue.Top(DestinyNow) == null) {
        DestinyNow = null;
        Wakeup(Queue.Top().Bed, Mutex)
      }
      else Wakeup(Queue.Top(DestinyNou).Bed, Mutex);
    Unlock(Mutex);
  }

} // CBridge

class CQueue {
  COrderedQueue q = new COrderedQueue(new FIFOPlusDestinyComparator());

  CRequest GetRequest(CProcessId ProcessId, CDestiny Destiny) {
    CRequest Request = new CRequest(ProcessId, Destiny);
    q.Put(Request);
    return Request;
  }

  boolean IsTheBest(CRequest Request) {
    return (q.Top(Request.Destiny) == Request);
  }

  boolean Ok(CRequest Request) {
    q.Del(Request);
  }
  CRequest Top(CDestiny Destiny) {
    return (CRequest) q.Top(Destiny);
  }
  CRequest Top(void) {
    return (CRequest) q.Top();
  }
} // CQueue

Observacoes:



Osvaldo Carvalho - Postscript - Comentários?