Exemplo n.º 1
0
        // 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]);
            }
        }
Exemplo n.º 2
0
 // 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);
         }
     }
 }
Exemplo n.º 3
0
 // 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 );
         }
     }
 }