Files
morbidissimo/modman/killthread.py

24 lines
604 B
Python

import ctypes
set_async_exc = ctypes.pythonapi.PyThreadState_SetAsyncExc
def killthread(thread, exc=KeyboardInterrupt):
if not thread.is_alive():
return
ident = ctypes.c_long(thread.ident)
exc = ctypes.py_object(exc)
res = set_async_exc(ident, exc)
if res == 0:
raise ValueError("thread id does not exist")
elif res > 1:
# if return value is greater than one, you are in trouble.
# you should call it again with exc=NULL to revert the effect.
set_async_exc(ident, None)
raise SystemError("PyThreadState_SetAsyncExc failed")