diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 11:25:13 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-05-03 11:25:13 +0000 |
commit | 458120dd40db6b4df55a4e96b650e16798ef06a0 (patch) | |
tree | 8f82685be24fef97e715c6f5ca4c68d34d5074ee /sys/lib/python/test/leakers | |
parent | 3a742c699f6806c1145aea5149bf15de15a0afd7 (diff) |
add hg and python
Diffstat (limited to 'sys/lib/python/test/leakers')
-rw-r--r-- | sys/lib/python/test/leakers/README.txt | 32 | ||||
-rw-r--r-- | sys/lib/python/test/leakers/__init__.py | 0 | ||||
-rw-r--r-- | sys/lib/python/test/leakers/test_ctypes.py | 16 | ||||
-rw-r--r-- | sys/lib/python/test/leakers/test_gestalt.py | 14 | ||||
-rw-r--r-- | sys/lib/python/test/leakers/test_selftype.py | 13 |
5 files changed, 75 insertions, 0 deletions
diff --git a/sys/lib/python/test/leakers/README.txt b/sys/lib/python/test/leakers/README.txt new file mode 100644 index 000000000..beeee0e7f --- /dev/null +++ b/sys/lib/python/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/sys/lib/python/test/leakers/__init__.py b/sys/lib/python/test/leakers/__init__.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/sys/lib/python/test/leakers/__init__.py diff --git a/sys/lib/python/test/leakers/test_ctypes.py b/sys/lib/python/test/leakers/test_ctypes.py new file mode 100644 index 000000000..0f9a2cdc9 --- /dev/null +++ b/sys/lib/python/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/sys/lib/python/test/leakers/test_gestalt.py b/sys/lib/python/test/leakers/test_gestalt.py new file mode 100644 index 000000000..46bfcc806 --- /dev/null +++ b/sys/lib/python/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/sys/lib/python/test/leakers/test_selftype.py b/sys/lib/python/test/leakers/test_selftype.py new file mode 100644 index 000000000..4207c328b --- /dev/null +++ b/sys/lib/python/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() |