示例#1
0
        /// <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);
        }
示例#2
0
        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();
                }
            }
        }
示例#3
0
        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();
                }
            }
        }
示例#4
0
        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();
                }
            }
        }
示例#5
0
        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();
                }
            }
        }
示例#6
0
        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);
        }
示例#7
0
        protected object ExtractItem(IExpirableItem val)
        {
            ExpirableItem item = val as ExpirableItem;

            if (item != null)
            {
                return(item.Item);
            }
            return(val);
        }
示例#8
0
        protected object ExtractItem(IExpirableItem val)
        {
            ExpirableItem wrapper = (val as ExpirableItem);

            if (wrapper != null)
            {
                return(wrapper.Item);
            }
            else
            {
                return(val);
            }
        }
示例#9
0
        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);
        }
示例#10
0
        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();
                }
            }
        }
示例#11
0
        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();
                }
            }
        }
示例#12
0
        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);
        }
示例#13
0
        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);
        }
示例#14
0
 private bool IsExpired(IExpirableItem item)
 {
     Fx.Assert(item.ExpirationTime == DateTime.MaxValue || item.ExpirationTime.Kind == DateTimeKind.Utc, "");
     return(item.ExpirationTime <= DateTime.UtcNow);
 }
示例#15
0
 internal void SetExpiration(IExpirableItem expirableItem)
     => this.expirableItem = expirableItem;
示例#16
0
 private bool IsExpired(IExpirableItem item)
 {
     return(item.ExpirationTime <= DateTime.UtcNow);
 }