summaryrefslogtreecommitdiff
path: root/psutil/_common.py
diff options
context:
space:
mode:
authorGiampaolo Rodola <g.rodola@gmail.com>2017-05-09 01:30:03 +0200
committerGiampaolo Rodola <g.rodola@gmail.com>2017-05-09 01:30:03 +0200
commit98af48a1c675e28c18f3dd05e11db6cb1d44dbaf (patch)
tree6a55c06c97da9613a46a29263c183693911cb84f /psutil/_common.py
parent09a8258ba06c068f32f8c66518c93666cfed5d0a (diff)
downloadpsutil-98af48a1c675e28c18f3dd05e11db6cb1d44dbaf.tar.gz
#802: change algorithm
Diffstat (limited to 'psutil/_common.py')
-rw-r--r--psutil/_common.py22
1 files changed, 14 insertions, 8 deletions
diff --git a/psutil/_common.py b/psutil/_common.py
index d26d0ff0..dc44f3a8 100644
--- a/psutil/_common.py
+++ b/psutil/_common.py
@@ -472,6 +472,7 @@ def deprecated_method(replacement):
_wrapn_lock = threading.Lock()
_wrapn_cache = {}
_wrapn_reminders = defaultdict(int)
+_wrapn_rmap = defaultdict(list)
def wrap_numbers(input_dict, name):
@@ -483,15 +484,12 @@ def wrap_numbers(input_dict, name):
# In case the number of keys changed between calls (e.g. a
# disk disappears) this removes the entry from _wrapn_reminders.
- # TODO: this is messy; change the algorithm.
old_dict = _wrapn_cache[name]
gone_keys = set(old_dict.keys()) - set(input_dict.keys())
- if gone_keys:
- for gone_key in gone_keys:
- for k in _wrapn_reminders.keys():
- nam, key, i = k
- if nam == name and key == gone_key:
- del _wrapn_reminders[k]
+ for gone_key in gone_keys:
+ for remkey in _wrapn_rmap[name + "-" + gone_key]:
+ del _wrapn_reminders[remkey]
+ del _wrapn_rmap[name + "-" + gone_key]
new_dict = {}
for key in input_dict.keys():
@@ -512,6 +510,8 @@ def wrap_numbers(input_dict, name):
if input_value < old_value:
_wrapn_reminders[remkey] += old_value
bits.append(input_value + _wrapn_reminders[remkey])
+ _wrapn_rmap[name + "-" + key].append(remkey)
+
new_dict[key] = input_nt._make(bits)
_wrapn_cache[name] = input_dict
@@ -523,9 +523,15 @@ def _wrapn_cache_clear(name=None):
if name is None:
_wrapn_cache.clear()
_wrapn_reminders.clear()
+ _wrapn_rmap.clear()
else:
_wrapn_cache.pop(name)
- # TODO
+ _wrapn_rmap.pop(name)
+
+
+def _wrapn_cache_info(name=None):
+ return (_wrapn_cache, _wrapn_reminders, _wrapn_rmap)
wrap_numbers.cache_clear = _wrapn_cache_clear
+wrap_numbers.cache_info = _wrapn_cache_info