Skip to content

Commit 082c8a8

Browse files
committed
fix duplicated close in LRUCache
close #324
1 parent 893d21d commit 082c8a8

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

shadowsocks/lru_cache.py

+20-1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ def sweep(self):
7474
# O(m)
7575
now = time.time()
7676
c = 0
77+
values_closed = list() # list is cheaper to create
7778
while len(self._last_visits) > 0:
7879
least = self._last_visits[0]
7980
if now - least <= self.timeout:
@@ -83,7 +84,9 @@ def sweep(self):
8384
if key in self._store:
8485
if now - self._keys_to_last_time[key] > self.timeout:
8586
value = self._store[key]
86-
self.close_callback(value)
87+
if value not in values_closed:
88+
self.close_callback(value)
89+
values_closed.append(value)
8790
for key in self._time_to_keys[least]:
8891
self._last_visits.popleft()
8992
if key in self._store:
@@ -126,5 +129,21 @@ def test():
126129
assert 'a' not in c
127130
assert 'b' not in c
128131

132+
global close_cb_called
133+
close_cb_called = False
134+
135+
def close_cb(t):
136+
global close_cb_called
137+
assert not close_cb_called
138+
close_cb_called = True
139+
140+
c = LRUCache(timeout=0.1, close_callback=close_cb)
141+
c['s'] = 1
142+
c['s']
143+
time.sleep(0.1)
144+
c['s']
145+
time.sleep(0.3)
146+
c.sweep()
147+
129148
if __name__ == '__main__':
130149
test()

0 commit comments

Comments
 (0)