File: CacheExpires.cs

package info (click to toggle)
mono 6.8.0.105%2Bdfsg-3.3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,284,512 kB
  • sloc: cs: 11,172,132; xml: 2,850,069; ansic: 671,653; cpp: 122,091; perl: 59,366; javascript: 30,841; asm: 22,168; makefile: 20,093; sh: 15,020; python: 4,827; pascal: 925; sql: 859; sed: 16; php: 1
file content (81 lines) | stat: -rw-r--r-- 1,857 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// 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);
		}
	}
}