Files
odoo_source/odoo/tools/lru.py
T
Xavier Morel 722f0f9b65 [IMP] core: deduplicate @locked and @synchronized, use in Registry
It's not entirely clear whether `@synchronized` is even useful, but
keep it for now. `locked` is just the default instance of
`@synchronised`.

- rewrite `@synchronized` using `decorator`, don't fold everything
  into a single call as there's a potential for parametric conflict
- remove the independent `locked` in `sql_db.py`
- convert `lru` to `locked`
- move `Registry` over to `locked` where applicable

closes odoo/odoo#82718

Signed-off-by: Raphael Collet <rco@odoo.com>
2022-01-26 08:48:43 +00:00

60 lines
1.2 KiB
Python

# -*- coding: utf-8 -*-
import collections
import threading
from .func import locked
__all__ = ['LRU']
class LRU(object):
"""
Implementation of a length-limited O(1) LRU map.
Original Copyright 2003 Josiah Carlson, later rebuilt on OrderedDict.
"""
def __init__(self, count, pairs=()):
self._lock = threading.RLock()
self.count = max(count, 1)
self.d = collections.OrderedDict()
for key, value in pairs:
self[key] = value
@locked
def __contains__(self, obj):
return obj in self.d
def get(self, obj, val=None):
try:
return self[obj]
except KeyError:
return val
@locked
def __getitem__(self, obj):
a = self.d[obj]
self.d.move_to_end(obj, last=False)
return a
@locked
def __setitem__(self, obj, val):
self.d[obj] = val
self.d.move_to_end(obj, last=False)
while len(self.d) > self.count:
self.d.popitem(last=True)
@locked
def __delitem__(self, obj):
del self.d[obj]
@locked
def __len__(self):
return len(self.d)
@locked
def pop(self,key):
return self.d.pop(key)
@locked
def clear(self):
self.d.clear()