示例#1
0
        public void RequestToken()
        {
            TokenMutex.WaitOne();
            if (CurrentToken == null)
            {
                Console.WriteLine("Requesting Token");
                RequestNumberList[RemoteServerGroup.Instance.NodeAddress]++;
                while (CurrentToken == null)
                {
                    var rsg = RemoteServerGroup.Instance;
                    var msg = new Message
                    {
                        Data          = RequestNumberList[RemoteServerGroup.Instance.NodeAddress].ToString(),
                        MonitorId     = Id,
                        MsgType       = MessageType.TokenRequest,
                        SendingServer = rsg.NodeAddress
                    };

                    foreach (var remoteAddress in rsg.RemoteAddressesList)
                    {
                        var remoteDispatch = new RemoteDispatch(msg, remoteAddress);
                        rsg.SendQueue.Add(remoteDispatch);
                    }

                    TokenMutex.ReleaseMutex();
                    CurrentToken = ReceivedToken.Take();
                    TokenMutex.WaitOne();
                }
            }
        }
        public void NotifyAll()
        {
            ConditionMutex.WaitOne();
            var msg = new Message
            {
                MsgType       = MessageType.NotifyAllResponse,
                Data          = Id,
                SendingServer = RemoteServerGroup.Instance.NodeAddress
            };

            while (RemoteNodesWaitingQueue.Count > 0)
            {
                if (RemoteNodesWaitingQueue[0] == RemoteServerGroup.Instance.NodeAddress)
                {
                    foreach (var queue in ConditionalQueues)
                    {
                        queue.Add(RemoteServerGroup.Instance.NodeAddress);
                    }

                    ConditionalQueues.Clear();
                }
                else
                {
                    var remoteAddress  = RemoteNodesWaitingQueue[0];
                    var remoteDispatch = new RemoteDispatch(msg, remoteAddress);
                    RemoteServerGroup.Instance.SendQueue.Add(remoteDispatch);
                }
                RemoteNodesWaitingQueue.RemoveAt(0);
            }
            ConditionMutex.ReleaseMutex();
        }
        private void InformSenderAboutFinish()
        {
            var msg = new Message
            {
                MsgType       = MessageType.EndingProgram,
                SendingServer = this.NodeAddress
            };
            var messageWrapper = new RemoteDispatch(msg, null);

            SendQueue.Add(messageWrapper);
        }
        private void BarrierWithTimeout()
        {
            var msg = new Message
            {
                MsgType       = MessageType.BarrierResponse,
                SendingServer = NodeAddress,
            };

            foreach (var remoteAddress in RemoteAddressesList)
            {
                var respond = new RemoteDispatch(msg, remoteAddress);
                SendQueue.Add(respond);
            }

            Console.WriteLine("Waiting on barrier");
            if (!SyncBarrier.Wait(TimeSpan.FromSeconds(Timeout)))
            {
                throw new Exception("Barrier timeout");
            }
        }
        public void Wait()
        {
            ConditionMutex.WaitOne();
            var waitForSignal = new BlockingCollection <string>();

            ConditionalQueues.Add(waitForSignal);
            var remoteServerGroup = RemoteServerGroup.Instance;

            if (!RemoteNodesWaitingQueue.Contains(remoteServerGroup.NodeAddress))
            {
                RemoteNodesWaitingQueue.Add(remoteServerGroup.NodeAddress);
            }
            var msg = new Message
            {
                MsgType       = MessageType.WaitRequest,
                Data          = Id,
                SendingServer = remoteServerGroup.NodeAddress,
            };

            foreach (var remoteAddress in remoteServerGroup.RemoteAddressesList)
            {
                var remoteDispatch = new RemoteDispatch(msg, remoteAddress);
                remoteServerGroup.SendQueue.Add(remoteDispatch);
            }

            for (var i = AssignedMonitors.Count - 1; i >= 0; i--)
            {
                AssignedMonitors[i].ReleaseLock();
            }
            ConditionMutex.ReleaseMutex();
            Console.WriteLine("Waiting to be notified");
            var notifiedBy = waitForSignal.Take();

            Console.WriteLine($"Notified by {notifiedBy}");
            for (var i = 0; i < AssignedMonitors.Count; i++)
            {
                AssignedMonitors[i].AcquireLock();
            }
        }
示例#6
0
        public void SendToken(string destination)
        {
            Console.WriteLine($"Sending Token to: {destination}");
            JsonSerializerSettings settings = new JsonSerializerSettings {
                TypeNameHandling = TypeNameHandling.All
            };

            CurrentToken.ReceivedData = JsonConvert.SerializeObject(this, settings);
            var tokenJson = JsonConvert.SerializeObject(CurrentToken, settings);

            CurrentToken = null;

            var msg = new Message
            {
                Data          = tokenJson,
                MonitorId     = Id,
                MsgType       = MessageType.TokenRespond,
                SendingServer = RemoteServerGroup.Instance.NodeAddress
            };
            var remoteDispatch = new RemoteDispatch(msg, destination);

            RemoteServerGroup.Instance.SendQueue.Add(remoteDispatch);
        }