]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-38323: Add guard clauses in MultiLoopChildWatcher. (GH-22756)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 16 Dec 2020 18:10:37 +0000 (10:10 -0800)
committerGitHub <noreply@github.com>
Wed, 16 Dec 2020 18:10:37 +0000 (10:10 -0800)
This is a trivial refactor in preparation for a fix for bpo-38323.
(cherry picked from commit 66d3b589c44fcbcf9afe1e442d9beac3bd8bcd34)

Co-authored-by: Chris Jerdonek <chris.jerdonek@gmail.com>
Lib/asyncio/unix_events.py

index f34a5b4b4437364c14e0f97278201e458a5fb4fc..3efa6698b89ced4673687957be769602c20c0af0 100644 (file)
@@ -1230,13 +1230,15 @@ class MultiLoopChildWatcher(AbstractChildWatcher):
 
     def close(self):
         self._callbacks.clear()
-        if self._saved_sighandler is not None:
-            handler = signal.getsignal(signal.SIGCHLD)
-            if handler != self._sig_chld:
-                logger.warning("SIGCHLD handler was changed by outside code")
-            else:
-                signal.signal(signal.SIGCHLD, self._saved_sighandler)
-            self._saved_sighandler = None
+        if self._saved_sighandler is None:
+            return
+
+        handler = signal.getsignal(signal.SIGCHLD)
+        if handler != self._sig_chld:
+            logger.warning("SIGCHLD handler was changed by outside code")
+        else:
+            signal.signal(signal.SIGCHLD, self._saved_sighandler)
+        self._saved_sighandler = None
 
     def __enter__(self):
         return self
@@ -1263,15 +1265,17 @@ class MultiLoopChildWatcher(AbstractChildWatcher):
         # The reason to do it here is that attach_loop() is called from
         # unix policy only for the main thread.
         # Main thread is required for subscription on SIGCHLD signal
+        if self._saved_sighandler is not None:
+            return
+
+        self._saved_sighandler = signal.signal(signal.SIGCHLD, self._sig_chld)
         if self._saved_sighandler is None:
-            self._saved_sighandler = signal.signal(signal.SIGCHLD, self._sig_chld)
-            if self._saved_sighandler is None:
-                logger.warning("Previous SIGCHLD handler was set by non-Python code, "
-                               "restore to default handler on watcher close.")
-                self._saved_sighandler = signal.SIG_DFL
+            logger.warning("Previous SIGCHLD handler was set by non-Python code, "
+                           "restore to default handler on watcher close.")
+            self._saved_sighandler = signal.SIG_DFL
 
-            # Set SA_RESTART to limit EINTR occurrences.
-            signal.siginterrupt(signal.SIGCHLD, False)
+        # Set SA_RESTART to limit EINTR occurrences.
+        signal.siginterrupt(signal.SIGCHLD, False)
 
     def _do_waitpid_all(self):
         for pid in list(self._callbacks):