From 84339c21ef3e9fdfbeefa95f27a1a0ae36f7fa88 Mon Sep 17 00:00:00 2001 From: Ankit Kumar Pandey Date: Mon, 24 Apr 2023 19:46:27 +0530 Subject: [PATCH 1/4] ensure previously registered forkers get executed along with new ones --- Lib/test/test_posix.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 444f8abe4607b71..d1fe8f6588f1eb0 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -276,6 +276,47 @@ def test_register_at_fork(self): """ assert_python_ok('-c', code) + @support.requires_fork() + def test_register_at_fork_multiple_runs(self): + # if we run fork multiple times, previously registered + # callbacks should get executed along with newly registered + code = """if 1: + import os + + r, w = os.pipe() + fin_r, fin_w = os.pipe() + # register all forkers + os.register_at_fork(before=lambda: os.write(w, b'A')) + os.register_at_fork(after_in_parent=lambda: os.write(w, b'B')) + os.register_at_fork(after_in_child=lambda: os.write(w, b'C')) + + pid = os.fork() + if pid == 0: + # register new forkers + os.register_at_fork(before=lambda: os.write(w, b'D')) + os.register_at_fork(after_in_parent=lambda: os.write(w, b'E')) + os.register_at_fork(after_in_child=lambda: os.write(w, b'F')) + child_pid = os.fork() + if child_pid == 0: + os.close(w) + os.read(fin_r, 1) + os._exit(0) + os.close(w) + os.read(fin_r, 1) + os._exit(0) + else: + os.close(w) + try: + with open(r, "rb") as f: + data = f.read() + assert len(data) == 9, data + # Check before-fork callbacks + assert data == b'ABCDABECF', data + finally: + os.write(fin_w, b'!') + """ + assert_python_ok('-c', code) + @unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()") def test_lockf(self): fd = os.open(os_helper.TESTFN, os.O_WRONLY | os.O_CREAT) From a803e077cda94360e2c6f55bb47e80c9a7cd56ff Mon Sep 17 00:00:00 2001 From: Ankit Kumar Pandey Date: Mon, 24 Apr 2023 21:08:43 +0530 Subject: [PATCH 2/4] properly exit test case --- Lib/test/test_posix.py | 1 + 1 file changed, 1 insertion(+) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index d1fe8f6588f1eb0..57f86882cad7fdf 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -303,6 +303,7 @@ def test_register_at_fork_multiple_runs(self): os._exit(0) os.close(w) os.read(fin_r, 1) + os.write(fin_w, b'!') os._exit(0) else: os.close(w) From e7a00d79c3f97b9ece83f15ddd4745d13c3273d9 Mon Sep 17 00:00:00 2001 From: Ankit Kumar Pandey <93041495+itsankitkp@users.noreply.github.com> Date: Mon, 24 Apr 2023 22:32:34 +0530 Subject: [PATCH 3/4] Update Lib/test/test_posix.py Co-authored-by: sunmy2019 <59365878+sunmy2019@users.noreply.github.com> --- Lib/test/test_posix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index 57f86882cad7fdf..e4504d7be6f5eff 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -296,7 +296,7 @@ def test_register_at_fork_multiple_runs(self): os.register_at_fork(before=lambda: os.write(w, b'D')) os.register_at_fork(after_in_parent=lambda: os.write(w, b'E')) os.register_at_fork(after_in_child=lambda: os.write(w, b'F')) - child_pid = os.fork() + child_pid = os.fork() if child_pid == 0: os.close(w) os.read(fin_r, 1) From 4f8e1b68735c4d33424e89eae7914b7950824d46 Mon Sep 17 00:00:00 2001 From: Ankit Kumar Pandey Date: Mon, 24 Apr 2023 22:35:16 +0530 Subject: [PATCH 4/4] update comments --- Lib/test/test_posix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_posix.py b/Lib/test/test_posix.py index e4504d7be6f5eff..5ba45c8c1dd3755 100644 --- a/Lib/test/test_posix.py +++ b/Lib/test/test_posix.py @@ -311,7 +311,7 @@ def test_register_at_fork_multiple_runs(self): with open(r, "rb") as f: data = f.read() assert len(data) == 9, data - # Check before-fork callbacks + # Check return values of all callbacks assert data == b'ABCDABECF', data finally: os.write(fin_w, b'!')