https://github.com/python/cpython/commit/7c9bbaaaa3c959d44b72419a825d34b75b7823fd
commit: 7c9bbaaaa3c959d44b72419a825d34b75b7823fd
branch: 3.13
author: Miss Islington (bot) <[email protected]>
committer: Yhg1s <[email protected]>
date: 2024-09-24T10:21:26-07:00
summary:

[3.13] gh-116622: Switch test_stress_delivery_simultaneous from SIGUSR1 to 
SIGUSR2 (GH-123981) (#123988)

gh-116622: Switch test_stress_delivery_simultaneous from SIGUSR1 to SIGUSR2 
(GH-123981)

Use SIGUSR1 instead of SIGUSR2 to improve reliability of signal stress test on 
Android.
(cherry picked from commit 43303e362e3a7e2d96747d881021a14c7f7e3d0b)

Co-authored-by: Malcolm Smith <[email protected]>

files:
M Android/testbed/app/src/main/python/main.py
M Lib/test/test_signal.py

diff --git a/Android/testbed/app/src/main/python/main.py 
b/Android/testbed/app/src/main/python/main.py
index c7314b500bf821..d6941b14412fcc 100644
--- a/Android/testbed/app/src/main/python/main.py
+++ b/Android/testbed/app/src/main/python/main.py
@@ -5,9 +5,25 @@
 import sys
 
 # Some tests use SIGUSR1, but that's blocked by default in an Android app in
-# order to make it available to `sigwait` in the "Signal Catcher" thread. That
-# thread's functionality is only relevant to the JVM ("forcing GC (no HPROF) 
and
-# profile save"), so disabling it should not weaken the tests.
+# order to make it available to `sigwait` in the Signal Catcher thread.
+# 
(https://cs.android.com/android/platform/superproject/+/android14-qpr3-release:art/runtime/signal_catcher.cc).
+# That thread's functionality is only useful for debugging the JVM, so 
disabling
+# it should not weaken the tests.
+#
+# There's no safe way of stopping the thread completely (#123982), but simply
+# unblocking SIGUSR1 is enough to fix most tests.
+#
+# However, in tests that generate multiple different signals in quick
+# succession, it's possible for SIGUSR1 to arrive while the main thread is busy
+# running the C-level handler for a different signal. In that case, the SIGUSR1
+# may be sent to the Signal Catcher thread instead, which will generate a log
+# message containing the text "reacting to signal".
+#
+# Such tests may need to be changed in one of the following ways:
+#   * Use a signal other than SIGUSR1 (e.g. test_stress_delivery_simultaneous 
in
+#     test_signal.py).
+#   * Send the signal to a specific thread rather than the whole process (e.g.
+#     test_signals in test_threadsignals.py.
 signal.pthread_sigmask(signal.SIG_UNBLOCK, [signal.SIGUSR1])
 
 sys.argv[1:] = shlex.split(os.environ["PYTHON_ARGS"])
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index 8101322347edc7..08f18a99f8d0e3 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -1327,15 +1327,18 @@ def test_stress_delivery_simultaneous(self):
         def handler(signum, frame):
             sigs.append(signum)
 
-        self.setsig(signal.SIGUSR1, handler)
+        # On Android, SIGUSR1 is unreliable when used in close proximity to
+        # another signal – see Android/testbed/app/src/main/python/main.py.
+        # So we use a different signal.
+        self.setsig(signal.SIGUSR2, handler)
         self.setsig(signal.SIGALRM, handler)  # for ITIMER_REAL
 
         expected_sigs = 0
         while expected_sigs < N:
             # Hopefully the SIGALRM will be received somewhere during
-            # initial processing of SIGUSR1.
+            # initial processing of SIGUSR2.
             signal.setitimer(signal.ITIMER_REAL, 1e-6 + random.random() * 1e-5)
-            os.kill(os.getpid(), signal.SIGUSR1)
+            os.kill(os.getpid(), signal.SIGUSR2)
 
             expected_sigs += 2
             # Wait for handlers to run to avoid signal coalescing

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: [email protected]

Reply via email to