mirror of
https://github.com/python/cpython.git
synced 2025-08-19 00:00:48 +00:00
[3.12] gh-109582: test_fork_signal_handling should wait for event (GH-109605) (#109695)
gh-109582: test_fork_signal_handling should wait for event (GH-109605)
Sometimes the child_handled event was missing because either
the child quits before it gets a chance to handle the signal,
or the parent asserts before the event notification is
delivered via IPC. Synchronize explicitly to avoid this.
(cherry picked from commit 608c1f3083
)
Co-authored-by: Davide Rizzo <sorcio@gmail.com>
This commit is contained in:
parent
5baa8af8da
commit
05b139b599
1 changed files with 11 additions and 2 deletions
|
@ -11,9 +11,11 @@ import socket
|
|||
import stat
|
||||
import sys
|
||||
import threading
|
||||
import time
|
||||
import unittest
|
||||
from unittest import mock
|
||||
import warnings
|
||||
from test import support
|
||||
from test.support import os_helper
|
||||
from test.support import socket_helper
|
||||
from test.support import wait_process
|
||||
|
@ -1911,8 +1913,14 @@ class TestFork(unittest.IsolatedAsyncioTestCase):
|
|||
parent_handled = manager.Event()
|
||||
|
||||
def child_main():
|
||||
signal.signal(signal.SIGTERM, lambda *args: child_handled.set())
|
||||
def on_sigterm(*args):
|
||||
child_handled.set()
|
||||
sys.exit()
|
||||
|
||||
signal.signal(signal.SIGTERM, on_sigterm)
|
||||
child_started.set()
|
||||
while True:
|
||||
time.sleep(1)
|
||||
|
||||
async def main():
|
||||
loop = asyncio.get_running_loop()
|
||||
|
@ -1922,7 +1930,7 @@ class TestFork(unittest.IsolatedAsyncioTestCase):
|
|||
process.start()
|
||||
child_started.wait()
|
||||
os.kill(process.pid, signal.SIGTERM)
|
||||
process.join()
|
||||
process.join(timeout=support.SHORT_TIMEOUT)
|
||||
|
||||
async def func():
|
||||
await asyncio.sleep(0.1)
|
||||
|
@ -1933,6 +1941,7 @@ class TestFork(unittest.IsolatedAsyncioTestCase):
|
|||
|
||||
asyncio.run(main())
|
||||
|
||||
child_handled.wait(timeout=support.SHORT_TIMEOUT)
|
||||
self.assertFalse(parent_handled.is_set())
|
||||
self.assertTrue(child_handled.is_set())
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue