diff options
| author | Lieuwe <lieuwemo@gmail.com> | 2011-03-18 16:04:51 (GMT) |
|---|---|---|
| committer | Lieuwe <lieuwemo@gmail.com> | 2011-03-18 16:04:51 (GMT) |
| commit | 9c39875ef09d439ef51716dba091188f72977f5e (patch) | |
| tree | fb0fd27a1bcd3e54a1913852c23aa137ee5eb30b /src/python/stdlib/test/leakers | |
| parent | bc8af4e2101ac93bdc51b59ee64fa43ecb2442f3 (diff) | |
| download | powder-9c39875ef09d439ef51716dba091188f72977f5e.zip powder-9c39875ef09d439ef51716dba091188f72977f5e.tar.gz | |
...
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() |
