diff options
author | bbangert <bbangert@localhost> | 2007-10-03 18:44:53 +0000 |
---|---|---|
committer | bbangert <bbangert@localhost> | 2007-10-03 18:44:53 +0000 |
commit | 9319b7ec34cebdb4de6504b7012c2ac3caf3246c (patch) | |
tree | 374a26a3db1d03abc5d66a44272bf7d21d5e9e34 | |
parent | d5209c2272de27cbdc3edef8386a8e5bf430edcd (diff) | |
download | paste-git-9319b7ec34cebdb4de6504b7012c2ac3caf3246c.tar.gz |
* Fixed memory leak with ``paste.registry`` not properly removing
all references to registered objects should register be called
multiple times during a single context for a StackedObjectProxy.
-rw-r--r-- | docs/news.txt | 4 | ||||
-rw-r--r-- | paste/registry.py | 15 |
2 files changed, 13 insertions, 6 deletions
diff --git a/docs/news.txt b/docs/news.txt index f13ce88..de7aa8f 100644 --- a/docs/news.txt +++ b/docs/news.txt @@ -6,6 +6,10 @@ News svn trunk --------- +* Fixed memory leak with ``paste.registry`` not properly removing + all references to registered objects should register be called + multiple times during a single context for a StackedObjectProxy. + * ``paste.httpheaders.CONTENT_RANGE`` returns ``bytes START-END/LENGTH`` instead of just ``START-END/LENGTH`` diff --git a/paste/registry.py b/paste/registry.py index 0bf56dc..a496fae 100644 --- a/paste/registry.py +++ b/paste/registry.py @@ -292,7 +292,7 @@ class Registry(object): """Register an object with a StackedObjectProxy""" stacked._push_object(obj) myreglist = self.reglist[-1] - myreglist[id(stacked)] = (stacked, obj) + myreglist.setdefault(id(stacked), []).append((stacked, obj)) def replace(self, stacked, obj): """Replace the object referenced by a StackedObjectProxy with a @@ -303,15 +303,18 @@ class Registry(object): """ myreglist = self.reglist[-1] if id(stacked) in myreglist: - stacked._pop_object(myreglist[id(stacked)][1]) - self.register(stacked, obj) + for stacked, obj in myreglist[id(stacked)]: + stacked._pop_object(obj) + del myreglist[id(stacked)] + stacked._push_object(obj) + myreglist.setdefault(id(stacked), []).append((stacked, obj)) def cleanup(self): """Remove all objects from all StackedObjectProxy instances that were tracked at this Registry context""" - for id, val in self.reglist[-1].iteritems(): - stacked, obj = val - stacked._pop_object(obj) + for id, lst in self.reglist[-1].iteritems(): + for stacked, obj in lst: + stacked._pop_object(obj) self.reglist.pop() class RegistryManager(object): |