(tid, exctype)
raises the exception, performs cleanup if needed
raises the exception, performs cleanup if needed
raises the exception performs cleanup if needed
def _async_raise(tid, exctype):
	"""raises the exception, performs cleanup if needed"""
	if not inspect.isclass(exctype):
		raise TypeError("Only types can be raised (not instances)")
	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), None)
		raise SystemError("PyThreadState_SetAsyncExc failed")
def _async_raise ( tid , exctype ) : if not inspect . isclass ( exctype ) : raise TypeError ( "Only types can be raised (not instances)" ) 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 ) , None ) raise SystemError ( "PyThreadState_SetAsyncExc failed" )