22import sys
33import inspect
44import os .path
5+ import scorep .trace_dummy
56
67try :
78 import threading
89except ImportError :
9- _settrace = sys .settrace
10+ _settrace = sys .setprofile
1011
1112 def _unsettrace ():
12- sys .settrace (None )
13+ sys .setprofile (None )
1314
1415else :
1516 def _settrace (func ):
16- threading .settrace (func )
17- sys .settrace (func )
17+ threading .setprofile (func )
18+ sys .setprofile (func )
1819
1920 def _unsettrace ():
20- sys .settrace (None )
21- threading .settrace (None )
21+ sys .setprofile (None )
22+ threading .setprofile (None )
2223
23- global_trace = None
24+ global_trace = scorep . trace_dummy . ScorepTraceDummy ()
2425
2526
2627class ScorepTrace :
2728 def __init__ (self , scorep_bindings , trace = True ):
2829 """
29- @param trace true if there shall be any tracing at all
30+ @param trace true if the tracing shall be initialised.
31+ Please note, that it is still possible to enable the tracing later using register()
3032 """
3133 global global_trace
3234 global_trace = self
3335
34- self .pathtobasename = {} # for memoizing os.path.basename
35- self .donothing = False
36- self .trace = trace
3736 self .scorep_bindings = scorep_bindings
38- if trace :
39- self .globaltrace = self .globaltrace_lt
40- self .localtrace = self .localtrace_trace
41- else :
42- self .donothing = True
37+ self .globaltrace = self .globaltrace_lt
38+ self .no_init_trace = not trace
4339
4440 def register (self ):
45- if not self .donothing :
46- _settrace (self .globaltrace )
41+ _settrace (self .globaltrace )
4742
4843 def unregister (self ):
49- if not self .donothing :
50- _unsettrace ()
44+ _unsettrace ()
5145
5246 def run (self , cmd ):
53- #import __main__
54- #dict = __main__.__dict__
55- #self.runctx(cmd, dict, dict)
5647 self .runctx (cmd )
5748
5849 def runctx (self , cmd , globals = None , locals = None ):
5950 if globals is None :
6051 globals = {}
6152 if locals is None :
6253 locals = {}
63- if not self .donothing :
64- _settrace ( self .globaltrace )
54+ if not self .no_init_trace :
55+ self .register ( )
6556 try :
6657 exec (cmd , globals , locals )
6758 finally :
68- if not self .donothing :
69- _unsettrace ()
59+ self .unregister ()
7060
7161 def runfunc (self , func , * args , ** kw ):
7262 result = None
73- if not self .donothing :
74- sys . settrace ( self .globaltrace )
63+ if not self .no_init_trace :
64+ self .register ( )
7565 try :
7666 result = func (* args , ** kw )
7767 finally :
78- if not self .donothing :
79- sys .settrace (None )
68+ self .unregister ()
8069 return result
8170
8271 def globaltrace_lt (self , frame , why , arg ):
@@ -96,23 +85,19 @@ def globaltrace_lt(self, frame, why, arg):
9685 else :
9786 full_file_name = "None"
9887 line_number = frame .f_lineno
99- if self . trace and not code .co_name == "_unsettrace" and not modulename == "scorep.trace" :
88+ if not code .co_name == "_unsettrace" and not modulename == "scorep.trace" :
10089 self .scorep_bindings .region_begin (
10190 modulename , code .co_name , full_file_name , line_number )
102- return self .localtrace
103- else :
104- return None
105-
106- def localtrace_trace (self , frame , why , arg ):
107- if why == "return" :
91+ return
92+ elif why == 'return' :
10893 code = frame .f_code
10994 modulename = frame .f_globals .get ('__name__' , None )
11095 if modulename is None :
11196 modulename = "None"
112- if self .trace :
113- self . scorep_bindings . region_end ( modulename , code . co_name )
114- return self . localtrace
115-
97+ self .scorep_bindings . region_end ( modulename , code . co_name )
98+ else :
99+ return
100+
116101 def user_region_begin (self , name , file_name = None , line_number = None ):
117102 """
118103 Begin of an User region. If file_name or line_number is None, both will
0 commit comments