/// <summary> /// This method must be called from within a writer lock /// </summary> private void PurgeStaleItems() { if (!(CacheLock.IsWriteLockHeld == true)) { // we failfast here because if we don't have the lock we could corrupt the cache Fx.Assert("Cache write lock is not held."); Environment.FailFast("Cache write lock is not held."); } ArrayList expiredItems = new ArrayList(); foreach (object key in _entries.Keys) { IExpirableItem item = _entries[key] as IExpirableItem; if (IsExpired(item)) { // this is a stale item. Remove! OnRemove(ExtractItem(item)); expiredItems.Add(key); } } for (int i = 0; i < expiredItems.Count; ++i) { _entries.Remove(expiredItems[i]); } CancelTimerIfNeeded(); _nextPurgeTimeUtc = DateTime.UtcNow.Add(_purgeInterval); }
protected object GetItem(object key) { bool lockHeld = false; try { try { } finally { CacheLock.EnterReadLock(); lockHeld = true; } IExpirableItem item = _entries[key] as IExpirableItem; if (item == null) { return(null); } else if (IsExpired(item)) { // this is a stale item return(null); } else { return(ExtractItem(item)); } } finally { if (lockHeld) { CacheLock.ExitReadLock(); } } }
protected bool TryRemoveItem(object key) { bool lockHeld = false; try { try { } finally { CacheLock.EnterWriteLock(); lockHeld = true; } PurgeIfNeeded(); IExpirableItem currentItem = _entries[key] as IExpirableItem; bool result = (currentItem != null) && !IsExpired(currentItem); if (currentItem != null) { _entries.Remove(key); if (_doRemoveNotification) { OnRemove(ExtractItem(currentItem)); } CancelTimerIfNeeded(); } return(result); } finally { if (lockHeld) { CacheLock.ExitWriteLock(); } } }
protected bool TryRemoveItem(object key) { bool lockHeld = false; try { try { } finally { this.cacheLock.AcquireWriterLock(-1); lockHeld = true; } PurgeIfNeeded(); IExpirableItem currentItem = this.entries[key] as IExpirableItem; bool result = (currentItem != null) && !IsExpired(currentItem); if (currentItem != null) { this.entries.Remove(key); if (doRemoveNotification) { this.OnRemove(ExtractItem(currentItem)); } CancelTimerIfNeeded(); } return(result); } finally { if (lockHeld) { this.cacheLock.ReleaseWriterLock(); } } }
protected object GetItem(object key) { bool lockHeld = false; try { try { } finally { this.CacheLock.AcquireReaderLock(-1); lockHeld = true; } IExpirableItem item = this.entries[key] as IExpirableItem; if (item == null) { return(null); } else if (IsExpired(item)) { // this is a stale item return(null); } else { return(ExtractItem(item)); } } finally { if (lockHeld) { this.CacheLock.ReleaseReaderLock(); } } }
protected object GetItem(object key) { object obj2; bool flag = false; try { try { } finally { this.cacheLock.AcquireReaderLock(-1); flag = true; } IExpirableItem item = this.entries[key] as IExpirableItem; if (item == null) { return(null); } if (this.IsExpired(item)) { return(null); } obj2 = this.ExtractItem(item); } finally { if (flag) { this.cacheLock.ReleaseReaderLock(); } } return(obj2); }
protected object ExtractItem(IExpirableItem val) { ExpirableItem item = val as ExpirableItem; if (item != null) { return(item.Item); } return(val); }
protected object ExtractItem(IExpirableItem val) { ExpirableItem wrapper = (val as ExpirableItem); if (wrapper != null) { return(wrapper.Item); } else { return(val); } }
protected bool TryAddItem(object key, IExpirableItem item, bool replaceExistingEntry) { bool flag2; bool flag = false; try { try { } finally { this.cacheLock.AcquireWriterLock(-1); flag = true; } this.PurgeIfNeeded(); this.EnforceQuota(); IExpirableItem item2 = this.entries[key] as IExpirableItem; if ((item2 == null) || this.IsExpired(item2)) { this.entries[key] = item; } else { if (!replaceExistingEntry) { return(false); } this.entries[key] = item; } if ((item2 != null) && this.doRemoveNotification) { this.OnRemove(this.ExtractItem(item2)); } this.StartTimerIfNeeded(); flag2 = true; } finally { if (flag) { this.cacheLock.ReleaseWriterLock(); } } return(flag2); }
protected bool TryAddItem(object key, IExpirableItem item, bool replaceExistingEntry) { bool lockHeld = false; try { try { } finally { CacheLock.EnterWriteLock(); lockHeld = true; } PurgeIfNeeded(); EnforceQuota(); IExpirableItem currentItem = _entries[key] as IExpirableItem; if (currentItem == null || IsExpired(currentItem)) { _entries[key] = item; } else if (!replaceExistingEntry) { return(false); } else { _entries[key] = item; } if (currentItem != null && _doRemoveNotification) { OnRemove(ExtractItem(currentItem)); } StartTimerIfNeeded(); return(true); } finally { if (lockHeld) { CacheLock.ExitWriteLock(); } } }
protected bool TryReplaceItem(object key, object item, DateTime expirationTime) { bool lockHeld = false; try { try { } finally { CacheLock.EnterWriteLock(); lockHeld = true; } PurgeIfNeeded(); EnforceQuota(); IExpirableItem currentItem = _entries[key] as IExpirableItem; if (currentItem == null || IsExpired(currentItem)) { return(false); } else { _entries[key] = new ExpirableItem(item, expirationTime); if (currentItem != null && _doRemoveNotification) { OnRemove(ExtractItem(currentItem)); } StartTimerIfNeeded(); return(true); } } finally { if (lockHeld) { CacheLock.ExitWriteLock(); } } }
protected bool TryRemoveItem(object key) { bool flag3; bool flag = false; try { try { } finally { this.cacheLock.AcquireWriterLock(-1); flag = true; } this.PurgeIfNeeded(); IExpirableItem item = this.entries[key] as IExpirableItem; bool flag2 = (item != null) && !this.IsExpired(item); if (item != null) { this.entries.Remove(key); if (this.doRemoveNotification) { this.OnRemove(this.ExtractItem(item)); } this.CancelTimerIfNeeded(); } flag3 = flag2; } finally { if (flag) { this.cacheLock.ReleaseWriterLock(); } } return(flag3); }
private void PurgeStaleItems() { if (!this.cacheLock.IsWriterLockHeld) { DiagnosticUtility.FailFast("Cache write lock is not held."); } ArrayList list = new ArrayList(); foreach (object obj2 in this.entries.Keys) { IExpirableItem item = this.entries[obj2] as IExpirableItem; if (this.IsExpired(item)) { this.OnRemove(this.ExtractItem(item)); list.Add(obj2); } } for (int i = 0; i < list.Count; i++) { this.entries.Remove(list[i]); } this.CancelTimerIfNeeded(); this.nextPurgeTimeUtc = DateTime.UtcNow.Add(this.purgeInterval); }
private bool IsExpired(IExpirableItem item) { Fx.Assert(item.ExpirationTime == DateTime.MaxValue || item.ExpirationTime.Kind == DateTimeKind.Utc, ""); return(item.ExpirationTime <= DateTime.UtcNow); }
internal void SetExpiration(IExpirableItem expirableItem) => this.expirableItem = expirableItem;
private bool IsExpired(IExpirableItem item) { return(item.ExpirationTime <= DateTime.UtcNow); }