Show More
The requested changes are too big and content was truncated. Show full diff
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 |
@@ -0,0 +1,45 b'' | |||||
|
1 | import threading | |||
|
2 | import inspect | |||
|
3 | import ctypes | |||
|
4 | ||||
|
5 | ||||
|
6 | def _async_raise(tid, exctype): | |||
|
7 | """raises the exception, performs cleanup if needed""" | |||
|
8 | if not inspect.isclass(exctype): | |||
|
9 | raise TypeError("Only types can be raised (not instances)") | |||
|
10 | res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype)) | |||
|
11 | if res == 0: | |||
|
12 | raise ValueError("invalid thread id") | |||
|
13 | elif res != 1: | |||
|
14 | # """if it returns a number greater than one, you're in trouble, | |||
|
15 | # and you should call it again with exc=NULL to revert the effect""" | |||
|
16 | ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0) | |||
|
17 | raise SystemError("PyThreadState_SetAsyncExc failed") | |||
|
18 | ||||
|
19 | ||||
|
20 | class Thread(threading.Thread): | |||
|
21 | def _get_my_tid(self): | |||
|
22 | """determines this (self's) thread id""" | |||
|
23 | if not self.isAlive(): | |||
|
24 | raise threading.ThreadError("the thread is not active") | |||
|
25 | ||||
|
26 | # do we have it cached? | |||
|
27 | if hasattr(self, "_thread_id"): | |||
|
28 | return self._thread_id | |||
|
29 | ||||
|
30 | # no, look for it in the _active dict | |||
|
31 | for tid, tobj in threading._active.items(): | |||
|
32 | if tobj is self: | |||
|
33 | self._thread_id = tid | |||
|
34 | return tid | |||
|
35 | ||||
|
36 | raise AssertionError("could not determine the thread's id") | |||
|
37 | ||||
|
38 | def raise_exc(self, exctype): | |||
|
39 | """raises the given exception type in the context of this thread""" | |||
|
40 | _async_raise(self._get_my_tid(), exctype) | |||
|
41 | ||||
|
42 | def kill(self): | |||
|
43 | """raises SystemExit in the context of the given thread, which should | |||
|
44 | cause the thread to exit silently (unless caught)""" | |||
|
45 | self.raise_exc(SystemExit) |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
1 | NO CONTENT: new file 100644 |
|
NO CONTENT: new file 100644 | ||
The requested commit or file is too big and content was truncated. Show full diff |
General Comments 0
You need to be logged in to leave comments.
Login now