Skip to content

Commit af537d1

Browse files
authored
update to python3.14.0a4 (#209)
1 parent 62ac7ac commit af537d1

File tree

3 files changed

+62
-3
lines changed

3 files changed

+62
-3
lines changed

py3.14/README_MODS

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,3 +1011,40 @@ diff Python-3.14.0a2/Lib/test/_test_multiprocessing.py Python-3.14.0a3/Lib/test/
10111011
> proc = self.Process(target=sys.exit)
10121012
> proc.start()
10131013
> proc.join()
1014+
# ----------------------------------------------------------------------
1015+
diff Python-3.14.0a3/Lib/multiprocessing/resource_tracker.py Python-3.14.0a4/Lib/multiprocessing/resource_tracker.py
1016+
157a158
1017+
> prev_sigmask = None
1018+
160c161
1019+
< signal.pthread_sigmask(signal.SIG_BLOCK, _IGNORED_SIGNALS)
1020+
---
1021+
> prev_sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, _IGNORED_SIGNALS)
1022+
163,164c164,165
1023+
< if _HAVE_SIGMASK:
1024+
< signal.pthread_sigmask(signal.SIG_UNBLOCK, _IGNORED_SIGNALS)
1025+
---
1026+
> if prev_sigmask is not None:
1027+
> signal.pthread_sigmask(signal.SIG_SETMASK, prev_sigmask)
1028+
diff Python-3.14.0a3/Lib/test/_test_multiprocessing.py Python-3.14.0a4/Lib/test/_test_multiprocessing.py
1029+
6047a6048,6068
1030+
> @unittest.skipUnless(hasattr(signal, "pthread_sigmask"), "pthread_sigmask is not available")
1031+
> def test_resource_tracker_blocked_signals(self):
1032+
> #
1033+
> # gh-127586: Check that resource_tracker does not override blocked signals of caller.
1034+
> #
1035+
> from multiprocessing.resource_tracker import ResourceTracker
1036+
> orig_sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, set())
1037+
> signals = {signal.SIGTERM, signal.SIGINT, signal.SIGUSR1}
1038+
>
1039+
> try:
1040+
> for sig in signals:
1041+
> signal.pthread_sigmask(signal.SIG_SETMASK, {sig})
1042+
> self.assertEqual(signal.pthread_sigmask(signal.SIG_BLOCK, set()), {sig})
1043+
> tracker = ResourceTracker()
1044+
> tracker.ensure_running()
1045+
> self.assertEqual(signal.pthread_sigmask(signal.SIG_BLOCK, set()), {sig})
1046+
> tracker._stop()
1047+
> finally:
1048+
> # restore sigmask to what it was before executing test
1049+
> signal.pthread_sigmask(signal.SIG_SETMASK, orig_sigmask)
1050+
>

py3.14/multiprocess/resource_tracker.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,13 +158,14 @@ def ensure_running(self):
158158
# that can make the child die before it registers signal handlers
159159
# for SIGINT and SIGTERM. The mask is unregistered after spawning
160160
# the child.
161+
prev_sigmask = None
161162
try:
162163
if _HAVE_SIGMASK:
163-
signal.pthread_sigmask(signal.SIG_BLOCK, _IGNORED_SIGNALS)
164+
prev_sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, _IGNORED_SIGNALS)
164165
pid = util.spawnv_passfds(exe, args, fds_to_pass)
165166
finally:
166-
if _HAVE_SIGMASK:
167-
signal.pthread_sigmask(signal.SIG_UNBLOCK, _IGNORED_SIGNALS)
167+
if prev_sigmask is not None:
168+
signal.pthread_sigmask(signal.SIG_SETMASK, prev_sigmask)
168169
except:
169170
os.close(w)
170171
raise

py3.14/multiprocess/tests/__init__.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6058,6 +6058,27 @@ def test_resource_tracker_exit_code(self):
60586058
cleanup=cleanup,
60596059
)
60606060

6061+
@unittest.skipUnless(hasattr(signal, "pthread_sigmask"), "pthread_sigmask is not available")
6062+
def test_resource_tracker_blocked_signals(self):
6063+
#
6064+
# gh-127586: Check that resource_tracker does not override blocked signals of caller.
6065+
#
6066+
from multiprocess.resource_tracker import ResourceTracker
6067+
orig_sigmask = signal.pthread_sigmask(signal.SIG_BLOCK, set())
6068+
signals = {signal.SIGTERM, signal.SIGINT, signal.SIGUSR1}
6069+
6070+
try:
6071+
for sig in signals:
6072+
signal.pthread_sigmask(signal.SIG_SETMASK, {sig})
6073+
self.assertEqual(signal.pthread_sigmask(signal.SIG_BLOCK, set()), {sig})
6074+
tracker = ResourceTracker()
6075+
tracker.ensure_running()
6076+
self.assertEqual(signal.pthread_sigmask(signal.SIG_BLOCK, set()), {sig})
6077+
tracker._stop()
6078+
finally:
6079+
# restore sigmask to what it was before executing test
6080+
signal.pthread_sigmask(signal.SIG_SETMASK, orig_sigmask)
6081+
60616082
class TestSimpleQueue(unittest.TestCase):
60626083

60636084
@classmethod

0 commit comments

Comments
 (0)