Package logilab-common-0 ::
Package 39 ::
Package 0 ::
Module cache
|
|
1 """Cache module, with a least recently used algorithm for the management of the
2 deletion of entries.
3
4 :copyright: 2002-2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
6 :license: General Public License version 2 - http://www.gnu.org/licenses
7 """
8 __docformat__ = "restructuredtext en"
9
10 from threading import Lock
11
12 from logilab.common.decorators import locked
13
14 _marker = object()
15
17 """A dictionnary like cache.
18
19 inv:
20 len(self._usage) <= self.size
21 len(self.data) <= self.size
22 """
23
25 """ Warning : Cache.__init__() != dict.__init__().
26 Constructor does not take any arguments beside size.
27 """
28 assert size >= 0, 'cache size must be >= 0 (0 meaning no caching)'
29 self.size = size
30 self._usage = []
31 self._lock = Lock()
32 super(Cache, self).__init__()
33
36
39
41 if not self._usage:
42 self._usage.append(key)
43 elif self._usage[-1] != key:
44 try:
45 self._usage.remove(key)
46 except ValueError:
47
48
49
50 if self.size and len(self._usage) >= self.size:
51 super(Cache, self).__delitem__(self._usage[0])
52 del self._usage[0]
53 self._usage.append(key)
54 else:
55 pass
56
58 value = super(Cache, self).__getitem__(key)
59 self._update_usage(key)
60 return value
61 __getitem__ = locked(_acquire, _release)(__getitem__)
62
64
65 if self.size > 0:
66 super(Cache, self).__setitem__(key, item)
67 self._update_usage(key)
68 __setitem__ = locked(_acquire, _release)(__setitem__)
69
73 __delitem__ = locked(_acquire, _release)(__delitem__)
74
78 clear = locked(_acquire, _release)(clear)
79
81 if key in self:
82 self._usage.remove(key)
83
84
85 return super(Cache, self).pop(key, default)
86 pop = locked(_acquire, _release)(pop)
87
89 raise NotImplementedError()
90
92 raise NotImplementedError()
93
95 raise NotImplementedError()
96