Skip to content

Commit ab957fd

Browse files
committed
ensure previously registered forkers get executed along with new ones
1 parent e38bebb commit ab957fd

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

Lib/test/test_posix.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,47 @@ def test_register_at_fork(self):
273273
"""
274274
assert_python_ok('-c', code)
275275

276+
@support.requires_fork()
277+
def test_register_at_fork_multiple_runs(self):
278+
# if we run fork multiple times, previously registered
279+
# callbacks should get executed along with newly registered
280+
code = """if 1:
281+
import os
282+
283+
r, w = os.pipe()
284+
fin_r, fin_w = os.pipe()
285+
# register all forkers
286+
os.register_at_fork(before=lambda: os.write(w, b'A'))
287+
os.register_at_fork(after_in_parent=lambda: os.write(w, b'B'))
288+
os.register_at_fork(after_in_child=lambda: os.write(w, b'C'))
289+
290+
pid = os.fork()
291+
if pid == 0:
292+
# register new forkers
293+
os.register_at_fork(before=lambda: os.write(w, b'D'))
294+
os.register_at_fork(after_in_parent=lambda: os.write(w, b'E'))
295+
os.register_at_fork(after_in_child=lambda: os.write(w, b'F'))
296+
child_pid = os.fork()
297+
if child_pid == 0:
298+
os.close(w)
299+
os.read(fin_r, 1)
300+
os._exit(0)
301+
os.close(w)
302+
os.read(fin_r, 1)
303+
os._exit(0)
304+
else:
305+
os.close(w)
306+
try:
307+
with open(r, "rb") as f:
308+
data = f.read()
309+
assert len(data) == 9, data
310+
# Check before-fork callbacks
311+
assert data == b'ABCDABECF', data
312+
finally:
313+
os.write(fin_w, b'!')
314+
"""
315+
assert_python_ok('-c', code)
316+
276317
@unittest.skipUnless(hasattr(posix, 'lockf'), "test needs posix.lockf()")
277318
def test_lockf(self):
278319
fd = os.open(os_helper.TESTFN, os.O_WRONLY | os.O_CREAT)

0 commit comments

Comments
 (0)