@@ -163,6 +163,7 @@ def __init__(self, timer=None, bias=None):
163163 self .timings = {}
164164 self .cur = None
165165 self .cmd = ""
166+ self .c_func_name = ""
166167
167168 if bias is None :
168169 bias = self .bias
@@ -214,6 +215,9 @@ def trace_dispatch(self, frame, event, arg):
214215 t = timer ()
215216 t = t [0 ] + t [1 ] - self .t - self .bias
216217
218+ if event == "c_call" :
219+ self .c_func_name = arg
220+
217221 if self .dispatch [event ](self , frame ,t ):
218222 t = timer ()
219223 self .t = t [0 ] + t [1 ]
@@ -227,7 +231,11 @@ def trace_dispatch(self, frame, event, arg):
227231 def trace_dispatch_i (self , frame , event , arg ):
228232 timer = self .timer
229233 t = timer () - self .t - self .bias
230- if self .dispatch [event ](self , frame ,t ):
234+
235+ if event == "c_call" :
236+ self .c_func_name = arg
237+
238+ if self .dispatch [event ](self , frame , t ):
231239 self .t = timer ()
232240 else :
233241 self .t = timer () - t # put back unrecorded delta
@@ -238,6 +246,10 @@ def trace_dispatch_i(self, frame, event, arg):
238246 def trace_dispatch_mac (self , frame , event , arg ):
239247 timer = self .timer
240248 t = timer ()/ 60.0 - self .t - self .bias
249+
250+ if event == "c_call" :
251+ self .c_func_name = arg
252+
241253 if self .dispatch [event ](self , frame , t ):
242254 self .t = timer ()/ 60.0
243255 else :
@@ -249,6 +261,9 @@ def trace_dispatch_l(self, frame, event, arg):
249261 get_time = self .get_time
250262 t = get_time () - self .t - self .bias
251263
264+ if event == "c_call" :
265+ self .c_func_name = arg
266+
252267 if self .dispatch [event ](self , frame , t ):
253268 self .t = get_time ()
254269 else :
@@ -291,6 +306,17 @@ def trace_dispatch_call(self, frame, t):
291306 timings [fn ] = 0 , 0 , 0 , 0 , {}
292307 return 1
293308
309+ def trace_dispatch_c_call (self , frame , t ):
310+ fn = ("" , 0 , self .c_func_name )
311+ self .cur = (t , 0 , 0 , fn , frame , self .cur )
312+ timings = self .timings
313+ if timings .has_key (fn ):
314+ cc , ns , tt , ct , callers = timings [fn ]
315+ timings [fn ] = cc , ns + 1 , tt , ct , callers
316+ else :
317+ timings [fn ] = 0 , 0 , 0 , 0 , {}
318+ return 1
319+
294320 def trace_dispatch_return (self , frame , t ):
295321 if frame is not self .cur [- 2 ]:
296322 assert frame is self .cur [- 2 ].f_back , ("Bad return" , self .cur [- 3 ])
@@ -333,6 +359,9 @@ def trace_dispatch_return(self, frame, t):
333359 "call" : trace_dispatch_call ,
334360 "exception" : trace_dispatch_exception ,
335361 "return" : trace_dispatch_return ,
362+ "c_call" : trace_dispatch_c_call ,
363+ "c_exception" : trace_dispatch_exception ,
364+ "c_return" : trace_dispatch_return ,
336365 }
337366
338367
0 commit comments