kind, result = c.recv()
if kind == '#RETURN':
return result
- raise convert_to_error(kind, result)
+ try:
+ raise convert_to_error(kind, result)
+ finally:
+ del result # break reference cycle
def convert_to_error(kind, result):
if kind == '#ERROR':
conn = self._Client(token.address, authkey=self._authkey)
dispatch(conn, None, 'decref', (token.id,))
return proxy
- raise convert_to_error(kind, result)
+ try:
+ raise convert_to_error(kind, result)
+ finally:
+ del result # break reference cycle
def _getvalue(self):
'''
if hasattr(manager, "shutdown"):
self.addCleanup(manager.shutdown)
+
+class FakeConnection:
+ def send(self, payload):
+ pass
+
+ def recv(self):
+ return '#ERROR', pyqueue.Empty()
+
+class TestManagerExceptions(unittest.TestCase):
+ # Issue 106558: Manager exceptions avoids creating cyclic references.
+ def setUp(self):
+ self.mgr = multiprocessing.Manager()
+
+ def tearDown(self):
+ self.mgr.shutdown()
+ self.mgr.join()
+
+ def test_queue_get(self):
+ queue = self.mgr.Queue()
+ if gc.isenabled():
+ gc.disable()
+ self.addCleanup(gc.enable)
+ try:
+ queue.get_nowait()
+ except pyqueue.Empty as e:
+ wr = weakref.ref(e)
+ self.assertEqual(wr(), None)
+
+ def test_dispatch(self):
+ if gc.isenabled():
+ gc.disable()
+ self.addCleanup(gc.enable)
+ try:
+ multiprocessing.managers.dispatch(FakeConnection(), None, None)
+ except pyqueue.Empty as e:
+ wr = weakref.ref(e)
+ self.assertEqual(wr(), None)
+
#
#
#