Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 1.0, 1.0.1, and 1.0.2

thread2: correct a bug with linux 64bit system

PyThreadState_SetAsyncExc 'C' thread function needed a long and python arg
passing default to int. Forced to long wiht ctypes.c_long()

Changeset 4be8e0270905

Parent 0c91f8d135c1

by ldufrechou

Changes to one file · Browse files at 4be8e0270905 Showing diff from parent 0c91f8d135c1 Diff from another changeset...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 # Interuptible threads  #  # http://sebulba.wikispaces.com/recipe+thread2  #  # This software may be used and distributed according to the terms of the  # GNU General Public License version 2, incorporated herein by reference.    import threading  import inspect  import ctypes      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(tid, ctypes.py_object(exctype)) + 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(tid, 0)   raise SystemError("PyThreadState_SetAsyncExc failed")      class Thread(threading.Thread):   def _get_my_tid(self):   """determines this (self's) thread id"""   if not self.isAlive():   raise threading.ThreadError("the thread is not active")     # do we have it cached?   if hasattr(self, "_thread_id"):   return self._thread_id     # no, look for it in the _active dict   for tid, tobj in threading._active.items():   if tobj is self:   self._thread_id = tid   return tid     raise AssertionError("could not determine the thread's id")     def raise_exc(self, exctype):   """raises the given exception type in the context of this thread"""   _async_raise(self._get_my_tid(), exctype)     def terminate(self):   """raises SystemExit in the context of the given thread, which should   cause the thread to exit silently (unless caught)"""   self.raise_exc(SystemExit)