Fixed #7339 -- Added manual calls to the garbage collector. This is required for PyPy and Jython; these implementations don't use reference counting, so you can't rely on __del__ being run immediately after del is called. Thanks to Maciej Fijalkowski (fijal) and Leo Soto.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@8004 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
parent
2f49d18071
commit
b58de15139
|
@ -2,6 +2,18 @@ from django.dispatch.dispatcher import *
|
||||||
from django.dispatch import dispatcher, robust
|
from django.dispatch import dispatcher, robust
|
||||||
import unittest
|
import unittest
|
||||||
import copy
|
import copy
|
||||||
|
import sys
|
||||||
|
import gc
|
||||||
|
|
||||||
|
if sys.platform.startswith('java'):
|
||||||
|
def garbage_collect():
|
||||||
|
"""Run the garbage collector and wait a bit to let it do his work"""
|
||||||
|
import time
|
||||||
|
gc.collect()
|
||||||
|
time.sleep(0.1)
|
||||||
|
else:
|
||||||
|
def garbage_collect():
|
||||||
|
gc.collect()
|
||||||
|
|
||||||
def x(a):
|
def x(a):
|
||||||
return a
|
return a
|
||||||
|
@ -21,6 +33,7 @@ class DispatcherTests(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
# track the initial state, since it's possible that others have bleed receivers in
|
# track the initial state, since it's possible that others have bleed receivers in
|
||||||
|
garbage_collect()
|
||||||
self.sendersBack = copy.copy(dispatcher.sendersBack)
|
self.sendersBack = copy.copy(dispatcher.sendersBack)
|
||||||
self.connections = copy.copy(dispatcher.connections)
|
self.connections = copy.copy(dispatcher.connections)
|
||||||
self.senders = copy.copy(dispatcher.senders)
|
self.senders = copy.copy(dispatcher.senders)
|
||||||
|
@ -86,6 +99,7 @@ class DispatcherTests(unittest.TestCase):
|
||||||
connect(a.a, signal, b)
|
connect(a.a, signal, b)
|
||||||
expected = []
|
expected = []
|
||||||
del a
|
del a
|
||||||
|
garbage_collect()
|
||||||
result = send('this',b, a=b)
|
result = send('this',b, a=b)
|
||||||
self.assertEqual(result, expected)
|
self.assertEqual(result, expected)
|
||||||
self.assertEqual(list(getAllReceivers(b,signal)), [])
|
self.assertEqual(list(getAllReceivers(b,signal)), [])
|
||||||
|
@ -101,6 +115,7 @@ class DispatcherTests(unittest.TestCase):
|
||||||
connect(a, signal, b)
|
connect(a, signal, b)
|
||||||
expected = []
|
expected = []
|
||||||
del a
|
del a
|
||||||
|
garbage_collect()
|
||||||
result = send('this',b, a=b)
|
result = send('this',b, a=b)
|
||||||
self.assertEqual(result, expected)
|
self.assertEqual(result, expected)
|
||||||
self.assertEqual(list(getAllReceivers(b,signal)), [])
|
self.assertEqual(list(getAllReceivers(b,signal)), [])
|
||||||
|
@ -123,6 +138,7 @@ class DispatcherTests(unittest.TestCase):
|
||||||
del a
|
del a
|
||||||
del b
|
del b
|
||||||
del result
|
del result
|
||||||
|
garbage_collect()
|
||||||
self._testIsClean()
|
self._testIsClean()
|
||||||
|
|
||||||
def testRobust(self):
|
def testRobust(self):
|
||||||
|
@ -141,4 +157,4 @@ def getSuite():
|
||||||
return unittest.makeSuite(DispatcherTests,'test')
|
return unittest.makeSuite(DispatcherTests,'test')
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main ()
|
unittest.main()
|
||||||
|
|
Loading…
Reference in New Issue