Esempio n. 1
0
        public void ReleaseToken()
        {
            TokenMutex.WaitOne();
            Console.WriteLine("Releasing Token");
            CurrentToken.LastRequestNumberList[RemoteServerGroup.Instance.NodeAddress] = RequestNumberList[RemoteServerGroup.Instance.NodeAddress];
            var rsg = RemoteServerGroup.Instance;

            foreach (var remoteAddress in rsg.RemoteAddressesList)
            {
                if (!CurrentToken.TokenWaitingQueueu.Contains(remoteAddress))
                {
                    if (RequestNumberList[remoteAddress] == CurrentToken.LastRequestNumberList[remoteAddress] + 1)
                    {
                        CurrentToken.TokenWaitingQueueu.Add(remoteAddress);
                    }
                }
            }

            if (CurrentToken.TokenWaitingQueueu.Count > 0)
            {
                var destination = CurrentToken.TokenWaitingQueueu[0];
                CurrentToken.TokenWaitingQueueu.RemoveAt(0);
                SendToken(destination);
            }

            ExecutingCriticalSection = false;
            TokenMutex.ReleaseMutex();
        }
Esempio n. 2
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();
                }
            }
        }
Esempio n. 3
0
 public void AcquireLock()
 {
     LocalMutex.WaitOne();
     Console.WriteLine("Acquire Lock");
     RequestToken();
     ExecutingCriticalSection = true;
     TokenMutex.ReleaseMutex();
 }