Ejemplo n.º 1
0
        private void Requesting(long sentRequestClock)
        {
            int  receivedAcks        = 0;
            T    updatedInternals    = Internals;
            long updatedSyncEntryNum = _syncEntryNumber;

            while (receivedAcks < Communicator.ProcessesCount - 1)
            {
                while (Communicator.ProbeMessage(Tags.ACK_TAG))
                {
                    MonitorMessage <T> received = Communicator
                                                  .ReceiveMessage <MonitorMessage <T> >(Tags.ACK_TAG);

                    if (received.LastCsEntrySyncNumber > updatedSyncEntryNum)
                    {
                        //synchronizing current internal state to fresher critical section output
                        updatedInternals    = received.InternalState;
                        updatedSyncEntryNum = received.LastCsEntrySyncNumber;
                    }
                    receivedAcks++;
                }

                if (Communicator.ProbeMessage(Tags.PRIORITY_REQ_TAG))
                {
                    MonitorMessage <T> received = Communicator
                                                  .ReceiveMessage <MonitorMessage <T> >(Tags.PRIORITY_REQ_TAG);
                    ReplyAck(received);
                }

                if (Communicator.ProbeMessage(Tags.REQ_TAG))
                {
                    MonitorMessage <T> received = Communicator
                                                  .ReceiveMessage <MonitorMessage <T> >(Tags.REQ_TAG);

                    if (IsPriorREQ(received, sentRequestClock))
                    {
                        ReplyAck(received);
                    }
                    else
                    {
                        _deferredMessages.Add(received);
                    }
                }
                Logger.LogRequestingWithReceivedAcks(Communicator.MyRank, receivedAcks, Communicator.Clock);
            }

            _syncEntryNumber = updatedSyncEntryNum;
            Internals        = updatedInternals;
        }
Ejemplo n.º 2
0
        private void Waiting()
        {
            while (!Communicator.ProbeMessage(Tags.WAKE_TAG))
            {
                if (Communicator.ProbeMessage(Tags.PRIORITY_REQ_TAG) && !Communicator.ProbeMessage(Tags.WAKE_TAG))
                {
                    MonitorMessage <T> received = Communicator
                                                  .ReceiveMessage <MonitorMessage <T> >(Tags.PRIORITY_REQ_TAG);
                    ReplyAck(received);
                }

                if (Communicator.ProbeMessage(Tags.REQ_TAG) && !Communicator.ProbeMessage(Tags.WAKE_TAG))
                {
                    MonitorMessage <T> receivedReq = Communicator.ReceiveMessage <MonitorMessage <T> >(Tags.REQ_TAG);
                    ReplyAck(receivedReq);
                }
            }

            MonitorMessage <T> awakeningMsg = Communicator.ReceiveMessage <MonitorMessage <T> >(Tags.WAKE_TAG);

            _syncEntryNumber = awakeningMsg.LastCsEntrySyncNumber;
            Internals        = awakeningMsg.InternalState;
        }
Ejemplo n.º 3
0
        public void Communicate(long millisTimeout)
        {
            long startTime   = DateTime.Now.Ticks;
            long elapsedTime = DateTime.Now.Ticks - startTime;

            while (elapsedTime < millisTimeout)
            {
                if (Communicator.ProbeMessage(Tags.PRIORITY_REQ_TAG))
                {
                    MonitorMessage <T> received = Communicator
                                                  .ReceiveMessage <MonitorMessage <T> >(Tags.PRIORITY_REQ_TAG);
                    ReplyAck(received);
                }

                if (Communicator.ProbeMessage(Tags.REQ_TAG))
                {
                    MonitorMessage <T> receivedReq = Communicator.ReceiveMessage <MonitorMessage <T> >(Tags.REQ_TAG);
                    ReplyAck(receivedReq);
                }

                elapsedTime = DateTime.Now.Ticks - startTime;
                //Console.WriteLine($"#{Communicator.MyRank} communicates, elapsed: {elapsedTime}");
            }
        }
Ejemplo n.º 4
0
        private void ReplyAck(MonitorMessage <T> msg)
        {
            var reply = BuildCurrentMonitorMessage();

            Communicator.Send(reply, msg.SenderRank, Tags.ACK_TAG);
        }
Ejemplo n.º 5
0
 private bool IsPriorREQ(MonitorMessage <T> requestMsg, long comparedClockVal)
 {
     return(requestMsg.Clock < comparedClockVal || requestMsg.Clock == comparedClockVal &&
            requestMsg.SenderRank < Communicator.MyRank);
 }