@@ -5536,6 +5536,40 @@ def test_too_long_name_resource(self):
55365536 with self .assertRaises (ValueError ):
55375537 resource_tracker .register (too_long_name_resource , rtype )
55385538
5539+ def _test_resource_tracker_leak_resources (self , context , delete_queue ):
5540+ from multiprocessing .resource_tracker import _resource_tracker
5541+ _resource_tracker .ensure_running ()
5542+ self .assertTrue (_resource_tracker ._check_alive ())
5543+
5544+ # Reset exit code value
5545+ _resource_tracker ._exitcode = None
5546+ exit_code_assert = self .assertNotEqual
5547+
5548+ mp_context = multiprocessing .get_context (context )
5549+
5550+ # Keep it on variable, so it won't be cleared yet
5551+ q = mp_context .Queue ()
5552+ if delete_queue :
5553+ del q
5554+ exit_code_assert = self .assertEqual
5555+
5556+ self .assertIsNone (_resource_tracker ._exitcode )
5557+ _resource_tracker ._stop ()
5558+
5559+ exit_code_assert (_resource_tracker ._exitcode , 0 )
5560+
5561+ def test_resource_tracker_should_return_0_exit_code_when_no_resources_were_leaked_spawn_ctx (self ):
5562+ self ._test_resource_tracker_leak_resources (context = "spawn" , delete_queue = True )
5563+
5564+ def test_resource_tracker_should_return_non_0_exit_code_when_resources_were_leaked_spawn_ctx (self ):
5565+ self ._test_resource_tracker_leak_resources (context = "spawn" , delete_queue = False )
5566+
5567+ def test_resource_tracker_should_return_0_exit_code_when_no_resources_were_leaked_forkserver_ctx (self ):
5568+ self ._test_resource_tracker_leak_resources (context = "forkserver" , delete_queue = True )
5569+
5570+ def test_resource_tracker_should_return_non_0_exit_code_when_resources_were_leaked_forkserver_ctx (self ):
5571+ self ._test_resource_tracker_leak_resources (context = "forkserver" , delete_queue = False )
5572+
55395573
55405574class TestSimpleQueue (unittest .TestCase ):
55415575
0 commit comments