1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 """Cache module, with a least recently used algorithm for the management of the
19 deletion of entries.
20
21
22
23
24 """
25 __docformat__ = "restructuredtext en"
26
27 from threading import Lock
28
29 from logilab.common.decorators import locked
30
31 _marker = object()
32
34 """A dictionary like cache.
35
36 inv:
37 len(self._usage) <= self.size
38 len(self.data) <= self.size
39 """
40
42 """ Warning : Cache.__init__() != dict.__init__().
43 Constructor does not take any arguments beside size.
44 """
45 assert size >= 0, 'cache size must be >= 0 (0 meaning no caching)'
46 self.size = size
47 self._usage = []
48 self._lock = Lock()
49 super(Cache, self).__init__()
50
53
56
58 if not self._usage:
59 self._usage.append(key)
60 elif self._usage[-1] != key:
61 try:
62 self._usage.remove(key)
63 except ValueError:
64
65
66
67 if self.size and len(self._usage) >= self.size:
68 super(Cache, self).__delitem__(self._usage[0])
69 del self._usage[0]
70 self._usage.append(key)
71 else:
72 pass
73
75 value = super(Cache, self).__getitem__(key)
76 self._update_usage(key)
77 return value
78 __getitem__ = locked(_acquire, _release)(__getitem__)
79
81
82 if self.size > 0:
83 super(Cache, self).__setitem__(key, item)
84 self._update_usage(key)
85 __setitem__ = locked(_acquire, _release)(__setitem__)
86
90 __delitem__ = locked(_acquire, _release)(__delitem__)
91
95 clear = locked(_acquire, _release)(clear)
96
98 if key in self:
99 self._usage.remove(key)
100
101
102 return super(Cache, self).pop(key, default)
103 pop = locked(_acquire, _release)(pop)
104
106 raise NotImplementedError()
107
109 raise NotImplementedError()
110
112 raise NotImplementedError()
113