LRUCache add 'clear' method

refine close
This commit is contained in:
BreakWa11 2016-05-16 16:56:10 +08:00
parent 691aa0970a
commit bb916eb705
3 changed files with 21 additions and 3 deletions

View file

@ -107,6 +107,25 @@ class LRUCache(collections.MutableMapping):
logging.debug('%d keys swept' % c)
return c < SWEEP_MAX_ITEMS
def clear(self):
now = time.time()
c = 0
while c < SWEEP_MAX_ITEMS:
if len(self._keys_to_last_time) == 0:
break
for key in self._keys_to_last_time:
break
last_t = self._keys_to_last_time[key]
value = self._store[key]
if self.close_callback is not None:
self.close_callback(value)
del self._store[key]
del self._keys_to_last_time[key]
c += 1
if c:
logging.debug('%d keys swept' % c)
return c < SWEEP_MAX_ITEMS
def test():
c = LRUCache(timeout=0.3)

View file

@ -497,7 +497,7 @@ class TCPRelayHandler(object):
if len(addrs) == 0:
raise Exception("getaddrinfo failed for %s:%d" % (ip, port))
af, socktype, proto, canonname, sa = addrs[0]
if self._forbidden_iplist:
if not self._remote_udp and self._forbidden_iplist:
if common.to_str(sa[0]) in self._forbidden_iplist:
raise Exception('IP %s is in forbidden list, reject' %
common.to_str(sa[0]))

View file

@ -1344,9 +1344,8 @@ class UDPRelay(object):
logging.debug('UDP close')
self._closed = True
if not next_tick:
self._cache.clear()
if self._eventloop:
self._eventloop.remove_periodic(self.handle_periodic)
self._eventloop.remove(self._server_socket)
self._server_socket.close()
for client in list(self._cache.values()):
client.close()