Author: Amaury Forgeot d'Arc <[email protected]>
Branch: py3.3
Changeset: r75229:59d5157e77a5
Date: 2015-01-02 21:35 +0100
http://bitbucket.org/pypy/pypy/changeset/59d5157e77a5/

Log:    Add signal.pthread_kill

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
@@ -25,6 +25,9 @@
         for name in ['ITIMER_REAL', 'ITIMER_VIRTUAL', 'ITIMER_PROF']:
             interpleveldefs[name] = 'space.wrap(interp_signal.%s)' % (name,)
 
+    if os.name == 'posix':
+        interpleveldefs['pthread_kill'] = 'interp_signal.pthread_kill'
+
     appleveldefs = {
     }
 
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
@@ -328,3 +328,13 @@
         c_getitimer(which, old)
 
         return itimer_retval(space, old[0])
+
+
+@unwrap_spec(tid=int, signum=int)
+def pthread_kill(space, tid, signum):
+    "Send a signal to a thread."
+    ret = c_pthread_kill(tid, signum)
+    if ret != 0:
+        raise exception_from_errno(space, space.w_OSError)
+    # the signal may have been send to the current thread
+    space.getexecutioncontext().checksignals()
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
@@ -319,3 +319,17 @@
         import signal
 
         raises(signal.ItimerError, signal.setitimer, -1, 0)
+
+class AppTestPThread:
+    spaceconfig = dict(usemodules=['signal', 'thread', 'time'])
+
+    def test_pthread_kill(self):
+        import signal
+        import _thread
+        signum = signal.SIGUSR1
+        def handler(signum, frame):
+            1/0
+        signal.signal(signum, handler)
+        tid = _thread.get_ident()
+        raises(ZeroDivisionError, signal.pthread_kill, tid, signum)
+        
diff --git a/rpython/rlib/rsignal.py b/rpython/rlib/rsignal.py
--- a/rpython/rlib/rsignal.py
+++ b/rpython/rlib/rsignal.py
@@ -96,3 +96,5 @@
     c_setitimer = external('setitimer',
                            [rffi.INT, itimervalP, itimervalP], rffi.INT)
     c_getitimer = external('getitimer', [rffi.INT, itimervalP], rffi.INT)
+
+c_pthread_kill = external('pthread_kill', [lltype.Signed, rffi.INT], rffi.INT)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to