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(); }
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 AcquireLock() { LocalMutex.WaitOne(); Console.WriteLine("Acquire Lock"); RequestToken(); ExecutingCriticalSection = true; TokenMutex.ReleaseMutex(); }