summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorAntoine Pitrou <pitrou@free.fr>2018-05-04 11:00:50 (GMT)
committerGitHub <noreply@github.com>2018-05-04 11:00:50 (GMT)
commit9d3627e311211a1b4abcda29c36fe4afe2c46532 (patch)
tree26f76c94bb55ee8b242f044efa26cfd8b08e9d26 /Lib
parent491bbedc209fea314a04cb3015da68fb0aa63238 (diff)
downloadcpython-9d3627e311211a1b4abcda29c36fe4afe2c46532.zip
cpython-9d3627e311211a1b4abcda29c36fe4afe2c46532.tar.gz
cpython-9d3627e311211a1b4abcda29c36fe4afe2c46532.tar.bz2
bpo-33332: Add signal.valid_signals() (GH-6581)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/asyncio/unix_events.py4
-rw-r--r--Lib/multiprocessing/resource_sharer.py2
-rw-r--r--Lib/signal.py10
-rw-r--r--Lib/test/support/__init__.py2
-rw-r--r--Lib/test/test_asyncio/test_unix_events.py12
-rw-r--r--Lib/test/test_signal.py30
6 files changed, 54 insertions, 6 deletions
diff --git a/Lib/asyncio/unix_events.py b/Lib/asyncio/unix_events.py
index 6cac137..f64037a 100644
--- a/Lib/asyncio/unix_events.py
+++ b/Lib/asyncio/unix_events.py
@@ -167,8 +167,8 @@ class _UnixSelectorEventLoop(selector_events.BaseSelectorEventLoop):
if not isinstance(sig, int):
raise TypeError(f'sig must be an int, not {sig!r}')
- if not (1 <= sig < signal.NSIG):
- raise ValueError(f'sig {sig} out of range(1, {signal.NSIG})')
+ if sig not in signal.valid_signals():
+ raise ValueError(f'invalid signal number {sig}')
def _make_read_pipe_transport(self, pipe, protocol, waiter=None,
extra=None):
diff --git a/Lib/multiprocessing/resource_sharer.py b/Lib/multiprocessing/resource_sharer.py
index 6d99da1..730b2aa 100644
--- a/Lib/multiprocessing/resource_sharer.py
+++ b/Lib/multiprocessing/resource_sharer.py
@@ -136,7 +136,7 @@ class _ResourceSharer(object):
def _serve(self):
if hasattr(signal, 'pthread_sigmask'):
- signal.pthread_sigmask(signal.SIG_BLOCK, range(1, signal.NSIG))
+ signal.pthread_sigmask(signal.SIG_BLOCK, signal.valid_signals())
while 1:
try:
with self._listener.accept() as conn:
diff --git a/Lib/signal.py b/Lib/signal.py
index 9f05c91..826b62c 100644
--- a/Lib/signal.py
+++ b/Lib/signal.py
@@ -65,8 +65,7 @@ if 'pthread_sigmask' in _globals:
if 'sigpending' in _globals:
@_wraps(_signal.sigpending)
def sigpending():
- sigs = _signal.sigpending()
- return set(_int_to_enum(x, Signals) for x in sigs)
+ return {_int_to_enum(x, Signals) for x in _signal.sigpending()}
if 'sigwait' in _globals:
@@ -76,4 +75,11 @@ if 'sigwait' in _globals:
return _int_to_enum(retsig, Signals)
sigwait.__doc__ = _signal.sigwait
+
+if 'valid_signals' in _globals:
+ @_wraps(_signal.valid_signals)
+ def valid_signals():
+ return {_int_to_enum(x, Signals) for x in _signal.valid_signals()}
+
+
del _globals, _wraps
diff --git a/Lib/test/support/__init__.py b/Lib/test/support/__init__.py
index a5f86d4..f1c4c95 100644
--- a/Lib/test/support/__init__.py
+++ b/Lib/test/support/__init__.py
@@ -2810,7 +2810,7 @@ class SaveSignals:
def __init__(self):
import signal
self.signal = signal
- self.signals = list(range(1, signal.NSIG))
+ self.signals = signal.valid_signals()
# SIGKILL and SIGSTOP signals cannot be ignored nor caught
for signame in ('SIGKILL', 'SIGSTOP'):
try:
diff --git a/Lib/test/test_asyncio/test_unix_events.py b/Lib/test/test_asyncio/test_unix_events.py
index 104f995..a01efed 100644
--- a/Lib/test/test_asyncio/test_unix_events.py
+++ b/Lib/test/test_asyncio/test_unix_events.py
@@ -69,6 +69,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.unix_events.signal')
def test_add_signal_handler_setup_error(self, m_signal):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
m_signal.set_wakeup_fd.side_effect = ValueError
self.assertRaises(
@@ -96,6 +97,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.unix_events.signal')
def test_add_signal_handler(self, m_signal):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
cb = lambda: True
self.loop.add_signal_handler(signal.SIGHUP, cb)
@@ -106,6 +108,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.unix_events.signal')
def test_add_signal_handler_install_error(self, m_signal):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
def set_wakeup_fd(fd):
if fd == -1:
@@ -125,6 +128,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.base_events.logger')
def test_add_signal_handler_install_error2(self, m_logging, m_signal):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
class Err(OSError):
errno = errno.EINVAL
@@ -145,6 +149,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
errno = errno.EINVAL
m_signal.signal.side_effect = Err
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
self.assertRaises(
RuntimeError,
@@ -156,6 +161,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.unix_events.signal')
def test_remove_signal_handler(self, m_signal):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
self.loop.add_signal_handler(signal.SIGHUP, lambda: True)
@@ -170,6 +176,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
def test_remove_signal_handler_2(self, m_signal):
m_signal.NSIG = signal.NSIG
m_signal.SIGINT = signal.SIGINT
+ m_signal.valid_signals = signal.valid_signals
self.loop.add_signal_handler(signal.SIGINT, lambda: True)
self.loop._signal_handlers[signal.SIGHUP] = object()
@@ -187,6 +194,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.base_events.logger')
def test_remove_signal_handler_cleanup_error(self, m_logging, m_signal):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
self.loop.add_signal_handler(signal.SIGHUP, lambda: True)
m_signal.set_wakeup_fd.side_effect = ValueError
@@ -197,6 +205,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.unix_events.signal')
def test_remove_signal_handler_error(self, m_signal):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
self.loop.add_signal_handler(signal.SIGHUP, lambda: True)
m_signal.signal.side_effect = OSError
@@ -207,6 +216,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.unix_events.signal')
def test_remove_signal_handler_error2(self, m_signal):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
self.loop.add_signal_handler(signal.SIGHUP, lambda: True)
class Err(OSError):
@@ -219,6 +229,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.unix_events.signal')
def test_close(self, m_signal):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
self.loop.add_signal_handler(signal.SIGHUP, lambda: True)
self.loop.add_signal_handler(signal.SIGCHLD, lambda: True)
@@ -236,6 +247,7 @@ class SelectorEventLoopSignalTests(test_utils.TestCase):
@mock.patch('asyncio.unix_events.signal')
def test_close_on_finalizing(self, m_signal, m_sys):
m_signal.NSIG = signal.NSIG
+ m_signal.valid_signals = signal.valid_signals
self.loop.add_signal_handler(signal.SIGHUP, lambda: True)
self.assertEqual(len(self.loop._signal_handlers), 1)
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index 7635eec..7ce89f6 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -67,9 +67,28 @@ class PosixTests(unittest.TestCase):
script = os.path.join(dirname, 'signalinterproctester.py')
assert_python_ok(script)
+ def test_valid_signals(self):
+ s = signal.valid_signals()
+ self.assertIsInstance(s, set)
+ self.assertIn(signal.Signals.SIGINT, s)
+ self.assertIn(signal.Signals.SIGALRM, s)
+ self.assertNotIn(0, s)
+ self.assertNotIn(signal.NSIG, s)
+ self.assertLess(len(s), signal.NSIG)
+
@unittest.skipUnless(sys.platform == "win32", "Windows specific")
class WindowsSignalTests(unittest.TestCase):
+
+ def test_valid_signals(self):
+ s = signal.valid_signals()
+ self.assertIsInstance(s, set)
+ self.assertGreaterEqual(len(s), 6)
+ self.assertIn(signal.Signals.SIGINT, s)
+ self.assertNotIn(0, s)
+ self.assertNotIn(signal.NSIG, s)
+ self.assertLess(len(s), signal.NSIG)
+
def test_issue9324(self):
# Updated for issue #10003, adding SIGBREAK
handler = lambda x, y: None
@@ -922,6 +941,17 @@ class PendingSignalsTests(unittest.TestCase):
self.assertRaises(TypeError, signal.pthread_sigmask, 1)
self.assertRaises(TypeError, signal.pthread_sigmask, 1, 2, 3)
self.assertRaises(OSError, signal.pthread_sigmask, 1700, [])
+ with self.assertRaises(ValueError):
+ signal.pthread_sigmask(signal.SIG_BLOCK, [signal.NSIG])
+
+ @unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
+ 'need signal.pthread_sigmask()')
+ def test_pthread_sigmask_valid_signals(self):
+ s = signal.pthread_sigmask(signal.SIG_BLOCK, signal.valid_signals())
+ self.addCleanup(signal.pthread_sigmask, signal.SIG_SETMASK, s)
+ # Get current blocked set
+ s = signal.pthread_sigmask(signal.SIG_UNBLOCK, signal.valid_signals())
+ self.assertLessEqual(s, signal.valid_signals())
@unittest.skipUnless(hasattr(signal, 'pthread_sigmask'),
'need signal.pthread_sigmask()')