// checks for old locks, and removes them public void Tick() { ArrayList RemovedLocks = new ArrayList(); foreach (DictionaryEntry entry in locks) { LockInfo lockinfo = (LockInfo)entry.Value; if (lockinfo.Timestamp.Subtract(DateTime.Now).Milliseconds > LockTimeoutSeconds * 1000) { NetworkInterfaces.IReplicated targetobject = lockinfo.TargetObject; if (IsMaster) { object clientconnection = lockinfo.Requester; new LockRpcToClient(clientconnection).LockReleased( clientconnection, targetobject); } else { ILockConsumer requester = (ILockConsumer)lockinfo.Requester; new LockRpcToServer(null).ReleaseLock( this, targetobject); } RemovedLocks.Add(lockinfo.TargetObject); } } for (int i = 0; i < RemovedLocks.Count; i++) { locks.Remove(RemovedLocks[i]); } }
// if we are master, we can grant lock if available, then signal requester immediately // otherwise we makes async rpc request to server public void RequestLock(ILockConsumer requester, NetworkInterfaces.IReplicated targetobject) { if (ismaster) { bool lockgranted = _MasterRequestLock(requester, targetobject); requester.LockResponse(this, new LockRequestEventArgs(targetobject, lockgranted)); } else { if (((LockInfo)locks[targetobject]).Requester == requester) { requester.LockResponse(this, new LockRequestEventArgs(targetobject, true)); } else if (locks[targetobject] != null) { requester.LockResponse(this, new LockRequestEventArgs(targetobject, false)); } else { pendingrpcrequests.Add(new object[] { requester, targetobject }); new LockRpcToServer(null).ReleaseLock(null, targetobject); } } }
// if we are master, we can grant lock if available, then signal requester immediately // otherwise we makes async rpc request to server public void RequestLock(ILockConsumer requester, NetworkInterfaces.IReplicated targetobject) { if( ismaster ) { bool lockgranted = _MasterRequestLock( requester, targetobject); requester.LockResponse( this, new LockRequestEventArgs( targetobject, lockgranted ) ); } else { if( ((LockInfo)locks[ targetobject ]).Requester == requester ) { requester.LockResponse( this, new LockRequestEventArgs( targetobject, true ) ); } else if( locks[ targetobject ] != null ) { requester.LockResponse( this, new LockRequestEventArgs( targetobject, false ) ); } else { pendingrpcrequests.Add( new object[]{ requester, targetobject } ); new LockRpcToServer( null ).ReleaseLock( null, targetobject ); } } }