Sun, 05 Mar 2017 16:09:50 +0100
Don't step into libraries after a QThread or threading.Thread has finished.
(grafted from 0f5d29acc8eaa6b8629586aac56833cb02a59698)
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

1  # * coding: utf8 * 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

2  
5389
9b1c800daff3
Updated copyright for 2017.
Detlev Offenbach <detlev@dieoffenbachs.de>
parents:
5273
diff
changeset

3  # Copyright (c) 2014  2017 Detlev Offenbach <detlev@dieoffenbachs.de> 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

4  # 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

5  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

6  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

7  Module implementing an import hook patching thread modules to get debugged too. 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

8  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

9  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

10  import os.path 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

11  import sys 
5240
71c51aae2f4e
Use importlib instead __import__ because it returns the correct module directly.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5228
diff
changeset

12  import importlib 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

13  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

14  if sys.version_info[0] == 2: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

15  import thread as _thread 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

16  else: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

17  import _thread 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

18  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

19  import threading 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

20  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

21  from DebugBase import DebugBase 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

22  
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

23  _qtThreadNumber = 1 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

24  
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

25  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

26  class ThreadExtension(object): 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

27  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

28  Class implementing the thread support for the debugger. 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

29  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

30  Provides methods for intercepting thread creation, retriving the running 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

31  threads and their name and state. 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

32  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

33  def __init__(self): 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

34  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

35  Constructor 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

36  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

37  self.threadNumber = 1 
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

38  self.enableImportHooks = True 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

39  self._original_start_new_thread = None 
5544
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

40  self.threadingAttached = False 
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

41  self.qtThreadAttached = False 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

42  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

43  self.clientLock = threading.RLock() 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

44  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

45  # dictionary of all threads running {id: DebugBase} 
5208
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

46  self.threads = {_thread.get_ident(): self} 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

47  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

48  # the "current" thread, basically for variables view 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

49  self.currentThread = self 
5221
960afd19c1b6
Give the next debugger command to the thread where we are stopped at the moment.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5209
diff
changeset

50  # the thread we are at a breakpoint continuing at next command 
960afd19c1b6
Give the next debugger command to the thread where we are stopped at the moment.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5209
diff
changeset

51  self.currentThreadExec = self 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

52  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

53  # special objects representing the main scripts thread and frame 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

54  self.mainThread = self 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

55  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

56  if sys.version_info[0] == 2: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

57  self.threadModName = 'thread' 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

58  else: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

59  self.threadModName = '_thread' 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

60  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

61  # reset already imported thread module to apply hooks at next import 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

62  del sys.modules[self.threadModName] 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

63  del sys.modules['threading'] 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

64  
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

65  sys.meta_path.insert(0, self) 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

66  
5208
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

67  def attachThread(self, target=None, args=None, kwargs={}, 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

68  mainThread=False): 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

69  """ 
5208
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

70  Public method to setup a standard thread for DebugClient to debug. 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

71  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

72  If mainThread is True, then we are attaching to the already 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

73  started mainthread of the app and the rest of the args are ignored. 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

74  
5208
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

75  @param target the start function of the target thread (i.e. the user 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

76  code) 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

77  @param args arguments to pass to target 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

78  @param kwargs keyword arguments to pass to target 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

79  @param mainThread True, if we are attaching to the already 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

80  started mainthread of the app 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

81  @return identifier of the created thread 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

82  """ 
5208
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

83  if mainThread: 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

84  ident = _thread.get_ident() 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

85  name = 'MainThread' 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

86  newThread = self.mainThread 
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

87  newThread.isMainThread = True 
5208
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

88  if self.debugging: 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

89  sys.setprofile(newThread.profile) 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

90  
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

91  else: 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

92  newThread = DebugBase(self) 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

93  ident = self._original_start_new_thread( 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

94  newThread.bootstrap, (target, args, kwargs)) 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

95  name = 'Thread{0}'.format(self.threadNumber) 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

96  self.threadNumber += 1 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

97  
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

98  newThread.id = ident 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

99  newThread.name = name 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

100  
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

101  self.threads[ident] = newThread 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

102  
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

103  return ident 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

104  
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

105  def threadTerminated(self, threadId): 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

106  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

107  Public method called when a DebugThread has exited. 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

108  
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

109  @param threadId id of the DebugThread that has exited 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

110  @type int 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

111  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

112  self.lockClient() 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

113  try: 
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

114  del self.threads[threadId] 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

115  except KeyError: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

116  pass 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

117  finally: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

118  self.unlockClient() 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

119  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

120  def lockClient(self, blocking=True): 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

121  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

122  Public method to acquire the lock for this client. 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

123  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

124  @param blocking flag to indicating a blocking lock 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

125  @type bool 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

126  @return flag indicating successful locking 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

127  @rtype bool 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

128  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

129  if blocking: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

130  self.clientLock.acquire() 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

131  else: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

132  return self.clientLock.acquire(blocking) 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

133  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

134  def unlockClient(self): 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

135  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

136  Public method to release the lock for this client. 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

137  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

138  try: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

139  self.clientLock.release() 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

140  except AssertionError: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

141  pass 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

142  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

143  def setCurrentThread(self, id): 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

144  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

145  Public method to set the current thread. 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

146  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

147  @param id the id the current thread should be set to. 
5222
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

148  @type int 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

149  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

150  try: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

151  self.lockClient() 
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

152  if id is None: 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

153  self.currentThread = None 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

154  else: 
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

155  self.currentThread = self.threads.get(id) 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

156  finally: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

157  self.unlockClient() 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

158  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

159  def dumpThreadList(self): 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

160  """ 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

161  Public method to send the list of threads. 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

162  """ 
5222
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

163  self.updateThreadList() 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

164  threadList = [] 
5208
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

165  if len(self.threads) > 1: 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

166  currentId = _thread.get_ident() 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

167  # update thread names set by user (threading.setName) 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

168  threadNames = {t.ident: t.getName() for t in threading.enumerate()} 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

169  
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

170  for id, thd in self.threads.items(): 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

171  d = {"id": id} 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

172  try: 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

173  d["name"] = threadNames.get(id, thd.name) 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

174  d["broken"] = thd.isBroken 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

175  except Exception: 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

176  d["name"] = 'UnknownThread' 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

177  d["broken"] = False 
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

178  
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

179  threadList.append(d) 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

180  else: 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

181  currentId = 1 
5208
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

182  d = {"id": 1} 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

183  d["name"] = "MainThread" 
5208
aa8045780ce4
Make attachThread and dumpThreadList runnable again.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5207
diff
changeset

184  d["broken"] = self.isBroken 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

185  threadList.append(d) 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

186  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

187  self.sendJsonCommand("ResponseThreadList", { 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

188  "currentID": currentId, 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

189  "threadList": threadList, 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

190  }) 
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

191  
5222
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

192  def getExecutedFrame(self, frame): 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

193  """ 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

194  Public method to return the currently executed frame. 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

195  
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

196  @param frame the current frame 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

197  @type frame object 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

198  @return the frame which is excecuted (without debugger frames) 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

199  @rtype frame object 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

200  """ 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

201  # to get the currently executed frame, skip all frames belonging to the 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

202  # debugger 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

203  while frame is not None: 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

204  baseName = os.path.basename(frame.f_code.co_filename) 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

205  if not baseName.startswith( 
5591
ac539bb30eb1
Don't update currentFrame when in a breakpoint or exception. Otherwise unpredictable frames could be shown.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5561
diff
changeset

206  ('DebugClientBase.py', 'DebugBase.py', 'AsyncFile.py', 
ac539bb30eb1
Don't update currentFrame when in a breakpoint or exception. Otherwise unpredictable frames could be shown.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5561
diff
changeset

207  'ThreadExtension.py')): 
5222
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

208  break 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

209  frame = frame.f_back 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

210  
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

211  return frame 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

212  
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

213  def updateThreadList(self): 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

214  """ 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

215  Public method to update the list of running threads. 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

216  """ 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

217  frames = sys._current_frames() 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

218  for id, frame in frames.items(): 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

219  # skip our own timer thread 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

220  if frame.f_code.co_name == '__eventPollTimer': 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

221  continue 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

222  
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

223  # Unknown thread 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

224  if id not in self.threads: 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

225  newThread = DebugBase(self) 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

226  name = 'Thread{0}'.format(self.threadNumber) 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

227  self.threadNumber += 1 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

228  
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

229  newThread.id = id 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

230  newThread.name = name 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

231  self.threads[id] = newThread 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

232  
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

233  # adjust current frame 
5269
0e96e1557c45
Fix for PyPy showing no local variables and suppress exception on old frames.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5240
diff
changeset

234  if "__pypy__" not in sys.builtin_module_names: 
5561
5fffb5cc1a88
When in unhandled exception, current frame lies in debugger files always. In breakpoints,
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5552
diff
changeset

235  # Don't update with None 
5fffb5cc1a88
When in unhandled exception, current frame lies in debugger files always. In breakpoints,
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5552
diff
changeset

236  currentFrame = self.getExecutedFrame(frame) 
5591
ac539bb30eb1
Don't update currentFrame when in a breakpoint or exception. Otherwise unpredictable frames could be shown.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5561
diff
changeset

237  if (currentFrame is not None and 
ac539bb30eb1
Don't update currentFrame when in a breakpoint or exception. Otherwise unpredictable frames could be shown.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5561
diff
changeset

238  self.threads[id].isBroken is False): 
5561
5fffb5cc1a88
When in unhandled exception, current frame lies in debugger files always. In breakpoints,
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5552
diff
changeset

239  self.threads[id].currentFrame = currentFrame 
5222
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

240  
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

241  # Clean up obsolet because terminated threads 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

242  self.threads = {id_: thrd for id_, thrd in self.threads.items() 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

243  if id_ in frames} 
6548dc1bfd48
Collect all running threads, even if they were not started by the debug client.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5221
diff
changeset

244  
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

245  def find_module(self, fullname, path=None): 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

246  """ 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

247  Public method returning the module loader. 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

248  
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

249  @param fullname name of the module to be loaded 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

250  @type str 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

251  @param path path to resolve the module name 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

252  @type str 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

253  @return module loader object 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

254  @rtype object 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

255  """ 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

256  if fullname in sys.modules or not self.debugging: 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

257  return None 
5228
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

258  
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

259  if fullname in [self.threadModName, 'PyQt4.QtCore', 'PyQt5.QtCore', 
5544
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

260  'PySide.QtCore', 'PySide2.QtCore', 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

261  'threading'] and self.enableImportHooks: 
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

262  # Disable hook to be able to import original module 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

263  self.enableImportHooks = False 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

264  return self 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

265  
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

266  return None 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

267  
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

268  def load_module(self, fullname): 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

269  """ 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

270  Public method to load a module. 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

271  
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

272  @param fullname name of the module to be loaded 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

273  @type str 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

274  @return reference to the loaded module 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

275  @rtype module 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

276  """ 
5240
71c51aae2f4e
Use importlib instead __import__ because it returns the correct module directly.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5228
diff
changeset

277  module = importlib.import_module(fullname) 
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

278  sys.modules[fullname] = module 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

279  if (fullname == self.threadModName and 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

280  self._original_start_new_thread is None): 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

281  # make thread hooks available to system 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

282  self._original_start_new_thread = module.start_new_thread 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

283  module.start_new_thread = self.attachThread 
5544
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

284  
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

285  # Add hook for threading.run() 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

286  elif (fullname == "threading" and self.threadingAttached is False): 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

287  self.threadingAttached = True 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

288  
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

289  # _debugClient as a class attribute can't be accessed in following 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

290  # class. Therefore we need a global variable. 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

291  _debugClient = self 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

292  
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

293  def _bootstrap(self, run): 
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

294  """ 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

295  Bootstrap for threading, which reports exceptions correctly. 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

296  
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

297  @param run the run method of threading.Thread 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

298  @type method pointer 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

299  """ 
5544
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

300  newThread = _debugClient.threads[self.ident] 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

301  newThread.name = self.name 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

302  # see DebugBase.bootstrap 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

303  sys.settrace(newThread.trace_dispatch) 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

304  try: 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

305  run() 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

306  except Exception: 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

307  excinfo = sys.exc_info() 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

308  newThread.user_exception(excinfo, True) 
5598
0e59df936fb6
Don't step into libraries after a QThread or threading.Thread has finished.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5591
diff
changeset

309  finally: 
0e59df936fb6
Don't step into libraries after a QThread or threading.Thread has finished.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5591
diff
changeset

310  sys.settrace(None) 
5544
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

311  
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

312  class ThreadWrapper(module.Thread): 
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

313  """ Wrapper class for threading.Thread. """ 
5544
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

314  
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

315  def __init__(self, *args, **kwargs): 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

316  # Overwrite the provided run method with our own, to 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

317  # intercept the thread creation by threading.Thread 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

318  self.run = lambda s=self, run=self.run: _bootstrap(s, run) 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

319  
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

320  super(ThreadWrapper, self).__init__(*args, **kwargs) 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

321  
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

322  module.Thread = ThreadWrapper 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

323  
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

324  # Add hook for *.QThread 
5544
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

325  elif (fullname in ['PyQt4.QtCore', 'PyQt5.QtCore', 
5a90f78a73c9
Handling of unhandled exceptions for threading without polluting its namespace.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5389
diff
changeset

326  'PySide.QtCore', 'PySide2.QtCore'] and 
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

327  self.qtThreadAttached is False): 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

328  self.qtThreadAttached = True 
5228
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

329  # _debugClient as a class attribute can't be accessed in following 
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

330  # class. Therefore we need a global variable. 
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

331  _debugClient = self 
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

332  
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

333  def _bootstrapQThread(self, run): 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

334  """ 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

335  Bootstrap for QThread, which reports exceptions correctly. 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

336  
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

337  @param run the run method of *.QThread 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

338  @type method pointer 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

339  """ 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

340  global _qtThreadNumber 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

341  
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

342  newThread = DebugBase(_debugClient) 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

343  ident = _thread.get_ident() 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

344  name = 'QtThread{0}'.format(_qtThreadNumber) 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

345  
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

346  _qtThreadNumber += 1 
5228
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

347  
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

348  newThread.id = ident 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

349  newThread.name = name 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

350  
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

351  _debugClient.threads[ident] = newThread 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

352  
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

353  # see DebugBase.bootstrap 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

354  sys.settrace(newThread.trace_dispatch) 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

355  try: 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

356  run() 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

357  except SystemExit: 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

358  # *.QThreads doesn't like SystemExit 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

359  pass 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

360  except Exception: 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

361  excinfo = sys.exc_info() 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

362  newThread.user_exception(excinfo, True) 
5598
0e59df936fb6
Don't step into libraries after a QThread or threading.Thread has finished.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5591
diff
changeset

363  finally: 
0e59df936fb6
Don't step into libraries after a QThread or threading.Thread has finished.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5591
diff
changeset

364  sys.settrace(None) 
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

365  
5240
71c51aae2f4e
Use importlib instead __import__ because it returns the correct module directly.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5228
diff
changeset

366  class QThreadWrapper(module.QThread): 
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

367  """ Wrapper class for *.QThread. """ 
5228
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

368  
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

369  def __init__(self, *args, **kwargs): 
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

370  # Overwrite the provided run method with our own, to 
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

371  # intercept the thread creation by Qt 
5552
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

372  self.run = lambda s=self, run=self.run: ( 
313a91a38aed
Handling of unhandled exceptions for *.QThread. Namespace is clean now.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5544
diff
changeset

373  _bootstrapQThread(s, run)) 
5228
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

374  
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

375  super(QThreadWrapper, self).__init__(*args, **kwargs) 
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

376  
4332a6751b14
Support for debugging of QThread processes added.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5222
diff
changeset

377  module.QThread = QThreadWrapper 
5209
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

378  
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

379  self.enableImportHooks = True 
cd058aa6af37
Insert import hook to modify thread module to use our bootstrap.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
5208
diff
changeset

380  return module 
5207
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

381  
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

382  # 
7283629b02c0
Relocated some methods from Debug*Thread and the remaining modules into a new one.
T.Rzepka <Tobias.Rzepka@gmail.com>
parents:
diff
changeset

383  # eflag: noqa = M702 