diff --git a/shadowsocks/lru_cache.py b/shadowsocks/lru_cache.py index 1313af5..bb28870 100644 --- a/shadowsocks/lru_cache.py +++ b/shadowsocks/lru_cache.py @@ -62,4 +62,4 @@ class LRUCache(collections.MutableMapping): c += 1 del self._time_to_keys[least] if c: - logging.debug('%d keys swept' % c) + logging.debug('%d keys swept' % c) \ No newline at end of file diff --git a/shadowsocks/server_pool.py b/shadowsocks/server_pool.py index 286471c..31f54bd 100644 --- a/shadowsocks/server_pool.py +++ b/shadowsocks/server_pool.py @@ -48,7 +48,8 @@ class ServerPool(object): self.mgr = asyncmgr.ServerMgr() self.tcp_servers_pool = {} self.tcp_ipv6_servers_pool = {} - #self.udp_servers_pool = {} + self.udp_servers_pool = {} + self.udp_ipv6_servers_pool = {} self.loop = eventloop.EventLoop() thread.start_new_thread(ServerPool._loop, (self.loop, self.dns_resolver, self.mgr)) @@ -106,7 +107,9 @@ class ServerPool(object): tcp_server = tcprelay.TCPRelay(a_config, self.dns_resolver, False) tcp_server.add_to_loop(self.loop) self.tcp_servers_pool.update({port: tcp_server}) - #udp_server = udprelay.UDPRelay(a_config, self.dns_resolver, False) + udp_server = udprelay.UDPRelay(a_config, self.dns_resolver, False) + udp_server.add_to_loop(self.loop) + self.udp_servers_pool.update({port: udp_server}) except Exception, e: logging.warn(e) @@ -124,14 +127,16 @@ class ServerPool(object): tcp_server = tcprelay.TCPRelay(a_config, self.dns_resolver, False) tcp_server.add_to_loop(self.loop) self.tcp_ipv6_servers_pool.update({port: tcp_server}) - #udp_server = udprelay.UDPRelay(a_config, self.dns_resolver, False) + udp_server = udprelay.UDPRelay(a_config, self.dns_resolver, False) + udp_server.add_to_loop(self.loop) + self.udp_ipv6_servers_pool.update({port: udp_server}) except Exception, e: logging.warn(e) return True def del_server(self, port): port = int(port) - logging.info("del server at %d" % int(port)) + logging.info("del server at %d" % port) try: udpsock = socket(AF_INET, SOCK_DGRAM) udpsock.sendto('%s:%s:0:0' % (Config.MANAGE_PASS, port), (Config.MANAGE_BIND_IP, Config.MANAGE_PORT)) @@ -144,23 +149,26 @@ class ServerPool(object): port = int(port) if port not in self.tcp_servers_pool: - logging.info("stopped server at %s:%d already stop" % (self.config['server'], int(port))) + logging.info("stopped server at %s:%d already stop" % (self.config['server'], port)) else: - logging.info("stopped server at %s:%d" % (self.config['server'], int(port))) + logging.info("stopped server at %s:%d" % (self.config['server'], port)) try: - self.tcp_servers_pool[int(port)].destroy() - del self.tcp_servers_pool[int(port)] - #del self.udp_servers_pool[int(port)] + self.tcp_servers_pool[port].destroy() + del self.tcp_servers_pool[port] + self.udp_servers_pool[port].destroy() + del self.udp_servers_pool[port] except Exception, e: logging.warn(e) if port not in self.tcp_ipv6_servers_pool: - logging.info("stopped server at %s:%d already stop" % (self.config['server_ipv6'], int(port))) + logging.info("stopped server at %s:%d already stop" % (self.config['server_ipv6'], port)) else: - logging.info("stopped server at %s:%d" % (self.config['server_ipv6'], int(port))) + logging.info("stopped server at %s:%d" % (self.config['server_ipv6'], port)) try: - self.tcp_ipv6_servers_pool[int(port)].destroy() - del self.tcp_ipv6_servers_pool[int(port)] + self.tcp_ipv6_servers_pool[port].destroy() + del self.tcp_ipv6_servers_pool[port] + self.udp_ipv6_servers_pool[port].destroy() + del self.udp_ipv6_servers_pool[port] except Exception, e: logging.warn(e) diff --git a/shadowsocks/udprelay.py b/shadowsocks/udprelay.py index d7e3d4c..6302b8c 100644 --- a/shadowsocks/udprelay.py +++ b/shadowsocks/udprelay.py @@ -249,6 +249,17 @@ class UDPRelay(object): self._eventloop.add(server_socket, eventloop.POLL_IN | eventloop.POLL_ERR) + def remove_to_loop(self): + self._eventloop.remove(self._server_socket) + self._eventloop.remove_handler(self._handle_events) + + def destroy(self): + #destroy all conn and server conn + self.remove_to_loop() + self.close() + #GC + self._cache = None + def _handle_events(self, events): for sock, fd, event in events: if sock == self._server_socket: