(self, signum)
| 958 | evt.set() |
| 959 | |
| 960 | def check_forkserver_death(self, signum): |
| 961 | # bpo-31308: if the forkserver process has died, we should still |
| 962 | # be able to create and run new Process instances (the forkserver |
| 963 | # is implicitly restarted). |
| 964 | if self.TYPE == 'threads': |
| 965 | self.skipTest('test not appropriate for {}'.format(self.TYPE)) |
| 966 | sm = multiprocessing.get_start_method() |
| 967 | if sm != 'forkserver': |
| 968 | # The fork method by design inherits all fds from the parent, |
| 969 | # trying to go against it is a lost battle |
| 970 | self.skipTest('test not appropriate for {}'.format(sm)) |
| 971 | |
| 972 | from multiprocessing.forkserver import _forkserver |
| 973 | _forkserver.ensure_running() |
| 974 | |
| 975 | # First process sleeps 500 ms |
| 976 | delay = 0.5 |
| 977 | |
| 978 | evt = self.Event() |
| 979 | proc = self.Process(target=self._sleep_and_set_event, args=(evt, delay)) |
| 980 | proc.start() |
| 981 | |
| 982 | pid = _forkserver._forkserver_pid |
| 983 | os.kill(pid, signum) |
| 984 | # give time to the fork server to die and time to proc to complete |
| 985 | time.sleep(delay * 2.0) |
| 986 | |
| 987 | evt2 = self.Event() |
| 988 | proc2 = self.Process(target=self._sleep_and_set_event, args=(evt2,)) |
| 989 | proc2.start() |
| 990 | proc2.join() |
| 991 | self.assertTrue(evt2.is_set()) |
| 992 | self.assertEqual(proc2.exitcode, 0) |
| 993 | |
| 994 | proc.join() |
| 995 | self.assertTrue(evt.is_set()) |
| 996 | self.assertIn(proc.exitcode, (0, 255)) |
| 997 | |
| 998 | def test_forkserver_sigint(self): |
| 999 | # Catchable signal |
no test coverage detected