[Zope3-dev] Leak in zope.component?

Jim Fulton jim at zope.com
Wed Aug 22 10:12:42 EDT 2007


On Aug 22, 2007, at 8:16 AM, Christian Zagrodnick wrote:

> Hi,
>
> I'm doing things wich z3c.zalchemy and trying to find out why my  
> database connections are kept open  even after unregistering  
> everything.
>
> Given the following very simple test:
>
>>>> import sys
>>>> import zope.component
>>>> import zope.interface
>>>> class IUtil(zope.interface.Interface):
> ...     pass
>
>>>> gsm = zope.component.getGlobalSiteManager()
>>>> utility = object()
>>>> sys.getrefcount(utility)
> 2
>>>> gsm.registerUtility(utility, IUtil)
>>>> sys.getrefcount(utility)
> 6
>
>>>> gsm.unregisterUtility(utility, IUtil)
> True
>>>> sys.getrefcount(utility)  # this fails
> 2
>
> ----------------------------------------------------------------------
> File "/Users/zagy/development/z3c.zalchemy/src/z3c/zalchemy/tests/ 
> dispose.txt", line 17, in dispose.txt
> Failed example:
>    sys.getrefcount(utility)  # this fails
> Expected:
>    2
> Got:
>    4
>
>
>
> So there are now two more references than before register/ 
> unregister. Am I missing something? Or is it leaking somewhere?

Here's what I get with the trunk of zope.component:

jim at ds9:~/p/zope/component/trunk$ bin/py

 >>> import sys, zope.component, zope.interface
 >>> class IUtil(zope.interface.Interface): pass
...
 >>> gsm = zope.component.getGlobalSiteManager()
 >>> utility = object(); sys.getrefcount(utility)
2
 >>> gsm.registerUtility(utility, IUtil); sys.getrefcount(utility)
5
 >>> gsm.unregisterUtility(utility, IUtil); sys.getrefcount(utility)
True
2

So I can't reproduce what you are seeing.

Try adding:

    >>> import gc; gc.collect()

before your last getrefcount call.

Jim

--
Jim Fulton			mailto:jim at zope.com		Python Powered!
CTO 				(540) 361-1714			http://www.python.org
Zope Corporation	http://www.zope.com		http://www.zope.org





More information about the Zope3-dev mailing list