diff options
| author | Simon <simon@hardwired.org.uk> | 2011-03-22 17:58:52 (GMT) |
|---|---|---|
| committer | Simon <simon@hardwired.org.uk> | 2011-03-22 17:58:52 (GMT) |
| commit | 2e401babb793238564ca640fc802a52ab7f6c293 (patch) | |
| tree | 87a9b471e82604e76f96d556f5771322fb31818a /src/python/stdlib/test/leakers | |
| parent | c096b2b14a200a0cc0a08cfea839c9e7f4edf22e (diff) | |
| parent | 04a9cbcb8855e64db660a8c6e23d79114b4afd83 (diff) | |
| download | powder-2e401babb793238564ca640fc802a52ab7f6c293.zip powder-2e401babb793238564ca640fc802a52ab7f6c293.tar.gz | |
Python console
Diffstat (limited to 'src/python/stdlib/test/leakers')
| -rw-r--r-- | src/python/stdlib/test/leakers/README.txt | 32 | ||||
| -rw-r--r-- | src/python/stdlib/test/leakers/__init__.py | 0 | ||||
| -rw-r--r-- | src/python/stdlib/test/leakers/test_ctypes.py | 16 | ||||
| -rw-r--r-- | src/python/stdlib/test/leakers/test_dictself.py | 12 | ||||
| -rw-r--r-- | src/python/stdlib/test/leakers/test_gestalt.py | 14 | ||||
| -rw-r--r-- | src/python/stdlib/test/leakers/test_selftype.py | 13 |
6 files changed, 87 insertions, 0 deletions
diff --git a/src/python/stdlib/test/leakers/README.txt b/src/python/stdlib/test/leakers/README.txt new file mode 100644 index 0000000..beeee0e --- /dev/null +++ b/src/python/stdlib/test/leakers/README.txt @@ -0,0 +1,32 @@ +This directory contains test cases that are known to leak references. +The idea is that you can import these modules while in the interpreter +and call the leak function repeatedly. This will only be helpful if +the interpreter was built in debug mode. If the total ref count +doesn't increase, the bug has been fixed and the file should be removed +from the repository. + +Note: be careful to check for cyclic garbage. Sometimes it may be helpful +to define the leak function like: + +def leak(): + def inner_leak(): + # this is the function that leaks, but also creates cycles + inner_leak() + gc.collect() ; gc.collect() ; gc.collect() + +Here's an example interpreter session for test_gestalt which still leaks: + +>>> from test.leakers.test_gestalt import leak +[24275 refs] +>>> leak() +[28936 refs] +>>> leak() +[28938 refs] +>>> leak() +[28940 refs] +>>> + +Once the leak is fixed, the test case should be moved into an appropriate +test (even if it was originally from the test suite). This ensures the +regression doesn't happen again. And if it does, it should be easier +to track down. diff --git a/src/python/stdlib/test/leakers/__init__.py b/src/python/stdlib/test/leakers/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/python/stdlib/test/leakers/__init__.py diff --git a/src/python/stdlib/test/leakers/test_ctypes.py b/src/python/stdlib/test/leakers/test_ctypes.py new file mode 100644 index 0000000..0f9a2cd --- /dev/null +++ b/src/python/stdlib/test/leakers/test_ctypes.py @@ -0,0 +1,16 @@ + +# Taken from Lib/ctypes/test/test_keeprefs.py, PointerToStructure.test(). +# When this leak is fixed, remember to remove from Misc/build.sh LEAKY_TESTS. + +from ctypes import Structure, c_int, POINTER +import gc + +def leak_inner(): + class POINT(Structure): + _fields_ = [("x", c_int)] + class RECT(Structure): + _fields_ = [("a", POINTER(POINT))] + +def leak(): + leak_inner() + gc.collect() diff --git a/src/python/stdlib/test/leakers/test_dictself.py b/src/python/stdlib/test/leakers/test_dictself.py new file mode 100644 index 0000000..99bd37d --- /dev/null +++ b/src/python/stdlib/test/leakers/test_dictself.py @@ -0,0 +1,12 @@ +'''Test case for "self.__dict__ = self" circular reference bug (#1469629)''' + +import gc + +class LeakyDict(dict): + pass + +def leak(): + ld = LeakyDict() + ld.__dict__ = ld + del ld + gc.collect(); gc.collect(); gc.collect() diff --git a/src/python/stdlib/test/leakers/test_gestalt.py b/src/python/stdlib/test/leakers/test_gestalt.py new file mode 100644 index 0000000..46bfcc8 --- /dev/null +++ b/src/python/stdlib/test/leakers/test_gestalt.py @@ -0,0 +1,14 @@ +import sys + +if sys.platform != 'darwin': + raise ValueError, "This test only leaks on Mac OS X" + +def leak(): + # taken from platform._mac_ver_lookup() + from gestalt import gestalt + import MacOS + + try: + gestalt('sysu') + except MacOS.Error: + pass diff --git a/src/python/stdlib/test/leakers/test_selftype.py b/src/python/stdlib/test/leakers/test_selftype.py new file mode 100644 index 0000000..4207c32 --- /dev/null +++ b/src/python/stdlib/test/leakers/test_selftype.py @@ -0,0 +1,13 @@ +# Reference cycles involving only the ob_type field are rather uncommon +# but possible. Inspired by SF bug 1469629. + +import gc + +def leak(): + class T(type): + pass + class U(type): + __metaclass__ = T + U.__class__ = U + del U + gc.collect(); gc.collect(); gc.collect() |
