Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3.3
Changeset: r75232:6a4993eee75c
Date: 2015-01-04 19:04 +0100
http://bitbucket.org/pypy/pypy/changeset/6a4993eee75c/

Log:    Add signal.sigpending()

diff --git a/pypy/module/signal/__init__.py b/pypy/module/signal/__init__.py
--- a/pypy/module/signal/__init__.py
+++ b/pypy/module/signal/__init__.py
@@ -27,6 +27,7 @@
 
     if os.name == 'posix':
         interpleveldefs['sigwait'] = 'interp_signal.sigwait'
+        interpleveldefs['sigpending'] = 'interp_signal.sigpending'
         interpleveldefs['pthread_kill'] = 'interp_signal.pthread_kill'
         interpleveldefs['pthread_sigmask'] = 'interp_signal.pthread_sigmask'
         interpleveldefs['SIG_BLOCK'] = 'space.wrap(interp_signal.SIG_BLOCK)'
diff --git a/pypy/module/signal/interp_signal.py 
b/pypy/module/signal/interp_signal.py
--- a/pypy/module/signal/interp_signal.py
+++ b/pypy/module/signal/interp_signal.py
@@ -383,6 +383,13 @@
             signum = signum_ptr[0]
     return space.wrap(signum)
 
+def sigpending(space):
+    with lltype.scoped_alloc(c_sigset_t.TO) as mask:
+        ret = c_sigpending(mask)
+        if ret != 0:
+            raise exception_from_errno(space, space.w_OSError)
+        return _sigset_to_signals(space, mask)
+
 @unwrap_spec(how=int)
 def pthread_sigmask(space, how, w_signals):
     with SignalMask(space, w_signals) as sigset:
diff --git a/pypy/module/signal/test/test_signal.py 
b/pypy/module/signal/test/test_signal.py
--- a/pypy/module/signal/test/test_signal.py
+++ b/pypy/module/signal/test/test_signal.py
@@ -355,5 +355,7 @@
         signal.pthread_sigmask(signal.SIG_BLOCK, (signum1, signum2))
         posix.kill(posix.getpid(), signum1)
         posix.kill(posix.getpid(), signum2)
+        assert signal.sigpending() == set((signum1, signum2))
         # Unblocking the 2 signals calls the C signal handler twice
         signal.pthread_sigmask(signal.SIG_UNBLOCK, (signum1, signum2))
+        assert signal.sigpending() == set()
diff --git a/rpython/rlib/rsignal.py b/rpython/rlib/rsignal.py
--- a/rpython/rlib/rsignal.py
+++ b/rpython/rlib/rsignal.py
@@ -107,5 +107,6 @@
     c_sigaddset = external('sigaddset', [c_sigset_t, rffi.INT], rffi.INT)
     c_sigismember = external('sigismember', [c_sigset_t, rffi.INT], rffi.INT)
     c_sigwait = external('sigwait', [c_sigset_t, rffi.INTP], rffi.INT)
+    c_sigpending = external('sigpending', [c_sigset_t], rffi.INT)
     c_pthread_sigmask = external('pthread_sigmask',
                                  [rffi.INT, c_sigset_t, c_sigset_t], rffi.INT)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to