diff options
author | Miro Hron?ok <miro@hroncok.cz> | 2018-06-08 18:49:42 +0200 |
---|---|---|
committer | Miro Hron?ok <miro@hroncok.cz> | 2018-06-08 18:49:42 +0200 |
commit | bb9bdf7e5b5cb0d3458242c5b8ba6134efb282a4 (patch) | |
tree | e3f03e7ce1f234e0c91075da6d0b56040f693162 /paste/util/killthread.py | |
download | paste-git-bb9bdf7e5b5cb0d3458242c5b8ba6134efb282a4.tar.gz |
Don't raise StopIteration from generator, return instead
See https://www.python.org/dev/peps/pep-0479/
Diffstat (limited to 'paste/util/killthread.py')
-rw-r--r-- | paste/util/killthread.py | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/paste/util/killthread.py b/paste/util/killthread.py new file mode 100644 index 0000000..4df4f42 --- /dev/null +++ b/paste/util/killthread.py @@ -0,0 +1,30 @@ +""" +Kill a thread, from http://sebulba.wikispaces.com/recipe+thread2 +""" +import six +try: + import ctypes +except ImportError: + raise ImportError( + "You cannot use paste.util.killthread without ctypes installed") +if not hasattr(ctypes, 'pythonapi'): + raise ImportError( + "You cannot use paste.util.killthread without ctypes.pythonapi") + +def async_raise(tid, exctype): + """raises the exception, performs cleanup if needed. + + tid is the value given by thread.get_ident() (an integer). + Raise SystemExit to kill a thread.""" + if not isinstance(exctype, (six.class_types, type)): + raise TypeError("Only types can be raised (not instances)") + if not isinstance(tid, int): + raise TypeError("tid must be an integer") + res = ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), ctypes.py_object(exctype)) + if res == 0: + raise ValueError("invalid thread id") + elif res != 1: + # """if it returns a number greater than one, you're in trouble, + # and you should call it again with exc=NULL to revert the effect""" + ctypes.pythonapi.PyThreadState_SetAsyncExc(ctypes.c_long(tid), 0) + raise SystemError("PyThreadState_SetAsyncExc failed") |