long DoRemoveExpiredItems(bool needLock) { long count = 0; bool locked = false; try { if (needLock) { cache_lock.EnterWriteLock(); locked = true; } if (timedItems == null) { return(0); } long now = DateTime.Now.Ticks; MemoryCacheEntry entry = timedItems.Peek(); while (entry != null) { if (entry.Disabled) { timedItems.Dequeue(); entry = timedItems.Peek(); continue; } if (entry.ExpiresAt > now) { break; } timedItems.Dequeue(); count++; DoRemoveEntry(entry, true, entry.Key, CacheEntryRemovedReason.Expired); entry = timedItems.Peek(); } if (entry == null) { timedItems = null; expirationTimer.Dispose(); expirationTimer = null; } return(count); } finally { if (locked) { cache_lock.ExitWriteLock(); } } }
// NOTE: this method _MUST_ be called with the write lock held void UpdateExpirable(MemoryCacheEntry entry) { if (timedItems == null) { timedItems = new MemoryCacheEntryPriorityQueue(); } timedItems.Enqueue(entry); if (expirationTimer == null) { expirationTimer = new Timer(RemoveExpiredItems, null, owner.TimerPeriod, owner.TimerPeriod); } }
long DoRemoveExpiredItems (bool needLock) { long count = 0; bool locked = false; try { if (needLock) { cache_lock.EnterWriteLock (); locked = true; } if (timedItems == null) return 0; long now = DateTime.Now.Ticks; MemoryCacheEntry entry = timedItems.Peek (); while (entry != null) { if (entry.Disabled) { timedItems.Dequeue (); entry = timedItems.Peek (); continue; } if (entry.ExpiresAt > now) break; timedItems.Dequeue (); count++; DoRemoveEntry (entry, true, entry.Key, CacheEntryRemovedReason.Expired); entry = timedItems.Peek (); } if (entry == null) { timedItems = null; expirationTimer.Dispose (); expirationTimer = null; } return count; } finally { if (locked) cache_lock.ExitWriteLock (); } }
// NOTE: this method _MUST_ be called with the write lock held void UpdateExpirable (MemoryCacheEntry entry) { if (timedItems == null) timedItems = new MemoryCacheEntryPriorityQueue (); timedItems.Enqueue (entry); if (expirationTimer == null) expirationTimer = new Timer (RemoveExpiredItems, null, owner.TimerPeriod, owner.TimerPeriod); }