summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbbangert <bbangert@localhost>2007-10-03 18:44:53 +0000
committerbbangert <bbangert@localhost>2007-10-03 18:44:53 +0000
commit9319b7ec34cebdb4de6504b7012c2ac3caf3246c (patch)
tree374a26a3db1d03abc5d66a44272bf7d21d5e9e34
parentd5209c2272de27cbdc3edef8386a8e5bf430edcd (diff)
downloadpaste-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.txt4
-rw-r--r--paste/registry.py15
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):