Xamarin Public Jenkins 6992685b86 Imported Upstream version 4.2.0.179
Former-commit-id: 0a113cb3a6feb7873f632839b1307cc6033cd595
2015-11-10 14:54:39 +00:00

81 lines
1.8 KiB
C#

// This file implements the classes ExpiresEntryRef and CacheExpires missing from .NET reference source
using System.Threading;
namespace System.Runtime.Caching
{
class ExpiresEntryRef
{
public static ExpiresEntryRef INVALID = new ExpiresEntryRef ();
public bool IsInvalid {
get { return this == INVALID; }
}
}
class CacheExpiresHelper : ICacheEntryHelper
{
public int Compare(MemoryCacheEntry entry1, MemoryCacheEntry entry2)
{
return DateTime.Compare (entry1.UtcAbsExp , entry2.UtcAbsExp);
}
public DateTime GetDateTime (MemoryCacheEntry entry)
{
return entry.UtcAbsExp;
}
}
class CacheExpires : CacheEntryCollection
{
public static TimeSpan MIN_UPDATE_DELTA = new TimeSpan (0, 0, 1);
public static TimeSpan EXPIRATIONS_INTERVAL = new TimeSpan (0, 0, 20);
public static CacheExpiresHelper helper = new CacheExpiresHelper ();
Timer timer;
public CacheExpires (MemoryCacheStore store)
: base (store, helper)
{
}
public new void Add (MemoryCacheEntry entry)
{
entry.ExpiresEntryRef = new ExpiresEntryRef ();
base.Add (entry);
}
public new void Remove (MemoryCacheEntry entry)
{
base.Remove (entry);
entry.ExpiresEntryRef = ExpiresEntryRef.INVALID;
}
public void UtcUpdate (MemoryCacheEntry entry, DateTime utcAbsExp)
{
base.Remove (entry);
entry.UtcAbsExp = utcAbsExp;
base.Add (entry);
}
public void EnableExpirationTimer (bool enable)
{
if (enable) {
if (timer != null)
return;
var period = (int) EXPIRATIONS_INTERVAL.TotalMilliseconds;
timer = new Timer ((o) => FlushExpiredItems (true), null, period, period);
} else {
timer.Dispose ();
timer = null;
}
}
public int FlushExpiredItems (bool blockInsert)
{
return base.FlushItems (DateTime.UtcNow, CacheEntryRemovedReason.Expired, blockInsert);
}
}
}