(self)
| 6195 | class TestResourceTracker(unittest.TestCase): |
| 6196 | |
| 6197 | def test_resource_tracker(self): |
| 6198 | # |
| 6199 | # Check that killing process does not leak named semaphores |
| 6200 | # |
| 6201 | cmd = '''if 1: |
| 6202 | import time, os |
| 6203 | import multiprocessing as mp |
| 6204 | from multiprocessing import resource_tracker |
| 6205 | from multiprocessing.shared_memory import SharedMemory |
| 6206 | |
| 6207 | mp.set_start_method("spawn") |
| 6208 | |
| 6209 | |
| 6210 | def create_and_register_resource(rtype): |
| 6211 | if rtype == "semaphore": |
| 6212 | lock = mp.Lock() |
| 6213 | return lock, lock._semlock.name |
| 6214 | elif rtype == "shared_memory": |
| 6215 | sm = SharedMemory(create=True, size=10) |
| 6216 | return sm, sm._name |
| 6217 | else: |
| 6218 | raise ValueError( |
| 6219 | "Resource type {{}} not understood".format(rtype)) |
| 6220 | |
| 6221 | |
| 6222 | resource1, rname1 = create_and_register_resource("{rtype}") |
| 6223 | resource2, rname2 = create_and_register_resource("{rtype}") |
| 6224 | |
| 6225 | os.write({w}, rname1.encode("ascii") + b"\\n") |
| 6226 | os.write({w}, rname2.encode("ascii") + b"\\n") |
| 6227 | |
| 6228 | time.sleep(10) |
| 6229 | ''' |
| 6230 | for rtype in resource_tracker._CLEANUP_FUNCS: |
| 6231 | with self.subTest(rtype=rtype): |
| 6232 | if rtype in ("noop", "dummy"): |
| 6233 | # Artefact resource type used by the resource_tracker |
| 6234 | # or tests |
| 6235 | continue |
| 6236 | r, w = os.pipe() |
| 6237 | p = subprocess.Popen([sys.executable, |
| 6238 | '-E', '-c', cmd.format(w=w, rtype=rtype)], |
| 6239 | pass_fds=[w], |
| 6240 | stderr=subprocess.PIPE) |
| 6241 | os.close(w) |
| 6242 | with open(r, 'rb', closefd=True) as f: |
| 6243 | name1 = f.readline().rstrip().decode('ascii') |
| 6244 | name2 = f.readline().rstrip().decode('ascii') |
| 6245 | _resource_unlink(name1, rtype) |
| 6246 | p.terminate() |
| 6247 | p.wait() |
| 6248 | |
| 6249 | err_msg = (f"A {rtype} resource was leaked after a process was " |
| 6250 | f"abruptly terminated") |
| 6251 | for _ in support.sleeping_retry(support.SHORT_TIMEOUT, |
| 6252 | err_msg): |
| 6253 | try: |
| 6254 | _resource_unlink(name2, rtype) |
nothing calls this directly
no test coverage detected