From faf1306aaebdbc8603b907cd1382abd7a787662f Mon Sep 17 00:00:00 2001 From: Antoine Millet Date: Wed, 5 Oct 2011 11:50:08 +0200 Subject: [PATCH] Fixed shutdown RpcConnection memory leak problem with RpcServer --- sjrpc/server/simple.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/sjrpc/server/simple.py b/sjrpc/server/simple.py index 685cec8..0ca7063 100644 --- a/sjrpc/server/simple.py +++ b/sjrpc/server/simple.py @@ -1,12 +1,12 @@ - +import gc import ssl import time import errno import socket import select +import weakref import logging import threading - from sjrpc.core import RpcConnection import pyev @@ -62,6 +62,16 @@ class RpcServer(object): conn = self._wrap(sock) self.register(conn) + def _clean_conn(self, ref): + ''' + Callback called by weakref when an object is about to be collected by + garbage collector. + ''' + try: + self._clients.remove(ref) + except KeyError: + pass + # # Public methods: # @@ -72,7 +82,10 @@ class RpcServer(object): :param conn: the connection to register. ''' - self._clients.add(conn) + self._clients.add(weakref.ref(conn, self._clean_conn)) + gc.collect() # Force a manual garbage collection to avoid memory leak + # with RpcConnections. This is maybe not required but I + # need to read docs about python's gc and circular refs. def unregister(self, conn, shutdown=False): ''' @@ -85,7 +98,6 @@ class RpcServer(object): if conn in self._clients: if shutdown: conn.shutdown() - self._clients.remove(conn) def run(self): ''' -- GitLab