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; }
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; }
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}"); } }
private void ReplyAck(MonitorMessage <T> msg) { var reply = BuildCurrentMonitorMessage(); Communicator.Send(reply, msg.SenderRank, Tags.ACK_TAG); }
private bool IsPriorREQ(MonitorMessage <T> requestMsg, long comparedClockVal) { return(requestMsg.Clock < comparedClockVal || requestMsg.Clock == comparedClockVal && requestMsg.SenderRank < Communicator.MyRank); }