summaryrefslogtreecommitdiffstats
path: root/Lib/test/_test_multiprocessing.py
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-08-23 23:44:07 (GMT)
committerGitHub <noreply@github.com>2023-08-23 23:44:07 (GMT)
commit9cf49aaaa0a08d430cd54a1c9ea022d40463bbfe (patch)
treef5b7a83b765a2ca316a14e545f782fe23c6ce820 /Lib/test/_test_multiprocessing.py
parent3aa7df6544950c21be57bd4bee5edbef4d196fce (diff)
downloadcpython-9cf49aaaa0a08d430cd54a1c9ea022d40463bbfe.zip
cpython-9cf49aaaa0a08d430cd54a1c9ea022d40463bbfe.tar.gz
cpython-9cf49aaaa0a08d430cd54a1c9ea022d40463bbfe.tar.bz2
[3.12] gh-77377: Ensure multiprocessing SemLock is valid for spawn-based Process before serializing it (GH-107275) (#108377)
gh-77377: Ensure multiprocessing SemLock is valid for spawn-based Process before serializing it (GH-107275) Ensure multiprocessing SemLock is valid for spawn Process before serializing it. Creating a multiprocessing SemLock with a fork context, and then trying to pass it to a spawn-created Process, would segfault if not detected early. --------- (cherry picked from commit 1700d34d314f5304a7a75363bda295a8c15c371f) Co-authored-by: albanD <desmaison.alban@gmail.com> Co-authored-by: blurb-it[bot] <43283697+blurb-it[bot]@users.noreply.github.com> Co-authored-by: Antoine Pitrou <pitrou@free.fr>
Diffstat (limited to 'Lib/test/_test_multiprocessing.py')
-rw-r--r--Lib/test/_test_multiprocessing.py22
1 files changed, 22 insertions, 0 deletions
diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.py
index 4afbe17..1afb873 100644
--- a/Lib/test/_test_multiprocessing.py
+++ b/Lib/test/_test_multiprocessing.py
@@ -5383,6 +5383,28 @@ class TestStartMethod(unittest.TestCase):
print(err)
self.fail("failed spawning forkserver or grandchild")
+ @unittest.skipIf(sys.platform == "win32",
+ "Only Spawn on windows so no risk of mixing")
+ @only_run_in_spawn_testsuite("avoids redundant testing.")
+ def test_mixed_startmethod(self):
+ # Fork-based locks cannot be used with spawned process
+ for process_method in ["spawn", "forkserver"]:
+ queue = multiprocessing.get_context("fork").Queue()
+ process_ctx = multiprocessing.get_context(process_method)
+ p = process_ctx.Process(target=close_queue, args=(queue,))
+ err_msg = "A SemLock created in a fork"
+ with self.assertRaisesRegex(RuntimeError, err_msg):
+ p.start()
+
+ # non-fork-based locks can be used with all other start methods
+ for queue_method in ["spawn", "forkserver"]:
+ for process_method in multiprocessing.get_all_start_methods():
+ queue = multiprocessing.get_context(queue_method).Queue()
+ process_ctx = multiprocessing.get_context(process_method)
+ p = process_ctx.Process(target=close_queue, args=(queue,))
+ p.start()
+ p.join()
+
@unittest.skipIf(sys.platform == "win32",
"test semantics don't make sense on Windows")