Esempio n. 1
0
        private void RemoveItem(object state)
        {
            try
            {
                ExpireItem expireItem = state as ExpireItem;
                if (expireItem == null)
                {
                    return;
                }
                if (MathUtils.Now.Subtract(expireItem.AccessTime).TotalMilliseconds >= _expireTime)
                {
                    lock (syncRoot)
                    {
                        _lockPool.Remove(expireItem.Key);
                    }

                    if (Monitor.IsEntered(expireItem))
                    {
                        Monitor.Exit(expireItem);
                    }
                    expireItem.Dispose();
                }
            }
            catch (Exception ex)
            {
                TraceLog.WriteError("LockCachePool ExpireCheck error:{0}", ex);
            }
        }
 private ExpireItem GetOrCreate(long key)
 {
     lock (syncRoot)
     {
         ExpireItem child;
         if (!_lockPool.ContainsKey(key))
         {
             child            = new ExpireItem();
             child.Key        = key;
             child.AccessTime = DateTime.Now;
             if (_expireTime > 0 && _checkTime > 0)
             {
                 int dueTime = 100 + (_lockPool.Count % 100); //Random start
                 child.ExpireTimer = new Timer(RemoveItem, child, dueTime, _checkTime);
             }
             _lockPool[key] = child;
         }
         else
         {
             child            = _lockPool[key];
             child.AccessTime = MathUtils.Now;
         }
         return(child);
     }
 }
Esempio n. 3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        public void Exit(long key)
        {
            ExpireItem lockItem = GetLockItem(key);

            if (lockItem != null)
            {
                Monitor.Exit(lockItem);
            }
        }
Esempio n. 4
0
        /// <summary>
        ///
        /// </summary>
        public void Enter(long key)
        {
            ExpireItem lockItem = GetOrAddLockItem(key);

            if (lockItem != null)
            {
                Monitor.Enter(lockItem);
            }
        }
 private void DoExit(ExpireItem lockItem)
 {
     if (lockItem != null && Monitor.IsEntered(lockItem))
     {
         Monitor.Exit(lockItem);
     }
     if (lockItem != null)
     {
         Interlocked.Exchange(ref lockItem.WaitTimeoutNum, 0);
     }
 }
Esempio n. 6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        /// <param name="timeout"></param>
        /// <param name="wait">wait get lock object</param>
        /// <param name="enter">enter lock object</param>
        /// <returns></returns>
        public bool TryEnter(long key, int timeout, object wait, out object enter)
        {
            ExpireItem lockItem = GetOrCreate(key);

            enter = lockItem.Target;
            if (Monitor.TryEnter(lockItem, timeout))
            {
                lockItem.Target = wait;
                return(true);
            }
            return(false);
        }
Esempio n. 7
0
        private ExpireItem GetLockItem(long key)
        {
            ExpireItem item = null;

            lock (syncRoot)
            {
                if (_lockPool.ContainsKey(key))
                {
                    item = _lockPool[key];
                }
            }
            return(item);
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        /// <param name="timeout"></param>
        /// <param name="waitTimeOutNum"></param>
        /// <returns></returns>
        public bool TryEnter(long key, int timeout, out long waitTimeOutNum)
        {
            ExpireItem lockItem = GetOrCreate(key);

            waitTimeOutNum = lockItem.WaitTimeoutNum;
            if (WaitTimeoutMaxNum > 0 && lockItem.WaitTimeoutNum > WaitTimeoutMaxNum)
            {
                return(false);
            }

            if (Monitor.TryEnter(lockItem, timeout))
            {
                return(true);
            }
            Interlocked.Increment(ref lockItem.WaitTimeoutNum);
            return(false);
        }
Esempio n. 9
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        /// <param name="timeout"></param>
        /// <returns></returns>
        public bool TryEnter(long key, int timeout)
        {
            ExpireItem lockItem = GetOrAddLockItem(key);

            return(Monitor.TryEnter(lockItem, timeout));
        }
Esempio n. 10
0
        /// <summary>
        ///
        /// </summary>
        public void Enter(long key)
        {
            ExpireItem lockItem = GetOrCreate(key);

            Monitor.Enter(lockItem);
        }
Esempio n. 11
0
 private ExpireItem Create(long key)
 {
     lock (syncRoot)
     {
         if (!_lockPool.ContainsKey(key))
         {
             var child = new ExpireItem();
             if (_expireTime > 0 && _checkTime > 0)
             {
                 int dueTime = 100 + (_lockPool.Count % 100); //Random start
                 child.Key = key;
                 child.ExpireTimer = new Timer(RemoveItem, child, dueTime, _checkTime);
                 child.AccessTime = DateTime.Now;
             }
             _lockPool[key] = child;
             return child;
         }
         return _lockPool[key];
     }
 }
 private void DoExit(ExpireItem lockItem)
 {
     if (lockItem != null && Monitor.IsEntered(lockItem))
     {
         Monitor.Exit(lockItem);
     }
     if (lockItem != null) Interlocked.Exchange(ref lockItem.WaitTimeoutNum, 0);
 }