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); } }
/// <summary> /// /// </summary> /// <param name="key"></param> public void Exit(long key) { ExpireItem lockItem = GetLockItem(key); if (lockItem != null) { Monitor.Exit(lockItem); } }
/// <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); } }
/// <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); }
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); }
/// <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)); }
/// <summary> /// /// </summary> public void Enter(long key) { ExpireItem lockItem = GetOrCreate(key); Monitor.Enter(lockItem); }
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); }