diff options
author | Chris Jerdonek <chris.jerdonek@gmail.com> | 2020-12-16 17:50:25 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-16 17:50:25 (GMT) |
commit | 66d3b589c44fcbcf9afe1e442d9beac3bd8bcd34 (patch) | |
tree | ce0529752abae2170e107a3024d26b9dbbfb41b6 | |
parent | c590c2338e5a36cf3ce5b55e6d366a0675ed1db5 (diff) | |
download | cpython-66d3b589c44fcbcf9afe1e442d9beac3bd8bcd34.zip cpython-66d3b589c44fcbcf9afe1e442d9beac3bd8bcd34.tar.gz cpython-66d3b589c44fcbcf9afe1e442d9beac3bd8bcd34.tar.bz2 |
bpo-38323: Add guard clauses in MultiLoopChildWatcher. (#22756)
This is a trivial refactor in preparation for a fix for bpo-38323.
-rw-r--r-- | Lib/asyncio/unix_events.py | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py index 33a6732..e4f445e 100644 --- a/Lib/asyncio/unix_events.py +++ b/Lib/asyncio/unix_events.py @@ -1226,13 +1226,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 @@ -1259,15 +1261,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): |