ruby-prof 0.18.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +44 -1
  3. data/LICENSE +2 -2
  4. data/README.rdoc +1 -483
  5. data/Rakefile +3 -6
  6. data/bin/ruby-prof +111 -128
  7. data/ext/ruby_prof/extconf.rb +6 -38
  8. data/ext/ruby_prof/rp_aggregate_call_tree.c +41 -0
  9. data/ext/ruby_prof/rp_aggregate_call_tree.h +13 -0
  10. data/ext/ruby_prof/rp_allocation.c +259 -0
  11. data/ext/ruby_prof/rp_allocation.h +31 -0
  12. data/ext/ruby_prof/rp_call_tree.c +353 -0
  13. data/ext/ruby_prof/rp_call_tree.h +43 -0
  14. data/ext/ruby_prof/rp_call_trees.c +266 -0
  15. data/ext/ruby_prof/rp_call_trees.h +29 -0
  16. data/ext/ruby_prof/rp_measure_allocations.c +25 -51
  17. data/ext/ruby_prof/rp_measure_memory.c +21 -56
  18. data/ext/ruby_prof/rp_measure_process_time.c +37 -43
  19. data/ext/ruby_prof/rp_measure_wall_time.c +40 -21
  20. data/ext/ruby_prof/rp_measurement.c +221 -0
  21. data/ext/ruby_prof/rp_measurement.h +50 -0
  22. data/ext/ruby_prof/rp_method.c +279 -439
  23. data/ext/ruby_prof/rp_method.h +33 -45
  24. data/ext/ruby_prof/rp_profile.c +902 -0
  25. data/ext/ruby_prof/rp_profile.h +36 -0
  26. data/ext/ruby_prof/rp_stack.c +163 -132
  27. data/ext/ruby_prof/rp_stack.h +18 -28
  28. data/ext/ruby_prof/rp_thread.c +192 -124
  29. data/ext/ruby_prof/rp_thread.h +18 -8
  30. data/ext/ruby_prof/ruby_prof.c +36 -778
  31. data/ext/ruby_prof/ruby_prof.h +11 -45
  32. data/ext/ruby_prof/vc/ruby_prof.vcxproj +18 -12
  33. data/lib/ruby-prof.rb +4 -21
  34. data/lib/ruby-prof/assets/call_stack_printer.html.erb +710 -0
  35. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  36. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -0
  37. data/lib/ruby-prof/call_tree.rb +57 -0
  38. data/lib/ruby-prof/call_tree_visitor.rb +36 -0
  39. data/lib/ruby-prof/compatibility.rb +37 -107
  40. data/lib/ruby-prof/exclude_common_methods.rb +198 -0
  41. data/lib/ruby-prof/measurement.rb +17 -0
  42. data/lib/ruby-prof/method_info.rb +47 -90
  43. data/lib/ruby-prof/printers/abstract_printer.rb +73 -50
  44. data/lib/ruby-prof/printers/call_info_printer.rb +24 -12
  45. data/lib/ruby-prof/printers/call_stack_printer.rb +66 -152
  46. data/lib/ruby-prof/printers/call_tree_printer.rb +20 -12
  47. data/lib/ruby-prof/printers/dot_printer.rb +5 -5
  48. data/lib/ruby-prof/printers/flat_printer.rb +6 -24
  49. data/lib/ruby-prof/printers/graph_html_printer.rb +6 -192
  50. data/lib/ruby-prof/printers/graph_printer.rb +11 -14
  51. data/lib/ruby-prof/printers/multi_printer.rb +66 -23
  52. data/lib/ruby-prof/profile.rb +10 -3
  53. data/lib/ruby-prof/thread.rb +5 -20
  54. data/lib/ruby-prof/version.rb +1 -1
  55. data/ruby-prof.gemspec +9 -2
  56. data/test/abstract_printer_test.rb +0 -27
  57. data/test/alias_test.rb +126 -0
  58. data/test/basic_test.rb +1 -86
  59. data/test/call_tree_visitor_test.rb +32 -0
  60. data/test/call_trees_test.rb +66 -0
  61. data/test/dynamic_method_test.rb +0 -2
  62. data/test/exclude_methods_test.rb +17 -12
  63. data/test/fiber_test.rb +214 -23
  64. data/test/gc_test.rb +105 -0
  65. data/test/inverse_call_tree_test.rb +175 -0
  66. data/test/line_number_test.rb +118 -40
  67. data/test/marshal_test.rb +115 -0
  68. data/test/measure_allocations.rb +30 -0
  69. data/test/measure_allocations_test.rb +361 -12
  70. data/test/measure_allocations_trace_test.rb +375 -0
  71. data/test/measure_memory_trace_test.rb +1101 -0
  72. data/test/measure_process_time_test.rb +757 -33
  73. data/test/measure_times.rb +56 -0
  74. data/test/measure_wall_time_test.rb +329 -149
  75. data/test/multi_printer_test.rb +1 -34
  76. data/test/pause_resume_test.rb +24 -15
  77. data/test/prime.rb +1 -1
  78. data/test/prime_script.rb +6 -0
  79. data/test/printer_call_stack_test.rb +28 -0
  80. data/test/printer_call_tree_test.rb +31 -0
  81. data/test/printer_flat_test.rb +68 -0
  82. data/test/printer_graph_html_test.rb +60 -0
  83. data/test/printer_graph_test.rb +41 -0
  84. data/test/printers_test.rb +32 -166
  85. data/test/printing_recursive_graph_test.rb +26 -72
  86. data/test/recursive_test.rb +68 -77
  87. data/test/stack_printer_test.rb +2 -15
  88. data/test/start_stop_test.rb +22 -25
  89. data/test/test_helper.rb +6 -261
  90. data/test/thread_test.rb +11 -54
  91. data/test/unique_call_path_test.rb +25 -107
  92. data/test/yarv_test.rb +1 -0
  93. metadata +43 -41
  94. data/examples/flat.txt +0 -50
  95. data/examples/graph.dot +0 -84
  96. data/examples/graph.html +0 -823
  97. data/examples/graph.txt +0 -139
  98. data/examples/multi.flat.txt +0 -23
  99. data/examples/multi.graph.html +0 -760
  100. data/examples/multi.grind.dat +0 -114
  101. data/examples/multi.stack.html +0 -547
  102. data/examples/stack.html +0 -547
  103. data/ext/ruby_prof/rp_call_info.c +0 -425
  104. data/ext/ruby_prof/rp_call_info.h +0 -53
  105. data/ext/ruby_prof/rp_measure.c +0 -40
  106. data/ext/ruby_prof/rp_measure.h +0 -45
  107. data/ext/ruby_prof/rp_measure_cpu_time.c +0 -136
  108. data/ext/ruby_prof/rp_measure_gc_runs.c +0 -73
  109. data/ext/ruby_prof/rp_measure_gc_time.c +0 -60
  110. data/lib/ruby-prof/aggregate_call_info.rb +0 -76
  111. data/lib/ruby-prof/assets/call_stack_printer.css.html +0 -117
  112. data/lib/ruby-prof/assets/call_stack_printer.js.html +0 -385
  113. data/lib/ruby-prof/call_info.rb +0 -115
  114. data/lib/ruby-prof/call_info_visitor.rb +0 -40
  115. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -83
  116. data/lib/ruby-prof/profile/exclude_common_methods.rb +0 -207
  117. data/lib/ruby-prof/profile/legacy_method_elimination.rb +0 -50
  118. data/test/aggregate_test.rb +0 -136
  119. data/test/block_test.rb +0 -74
  120. data/test/call_info_test.rb +0 -78
  121. data/test/call_info_visitor_test.rb +0 -31
  122. data/test/issue137_test.rb +0 -63
  123. data/test/measure_cpu_time_test.rb +0 -212
  124. data/test/measure_gc_runs_test.rb +0 -32
  125. data/test/measure_gc_time_test.rb +0 -36
  126. data/test/measure_memory_test.rb +0 -33
  127. data/test/method_elimination_test.rb +0 -84
  128. data/test/module_test.rb +0 -45
  129. data/test/stack_test.rb +0 -138
@@ -1,425 +0,0 @@
1
- /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- #include "ruby_prof.h"
5
-
6
- #define INITIAL_CALL_INFOS_SIZE 2
7
-
8
- VALUE cCallInfo;
9
-
10
-
11
- // Forward declarations
12
- st_table * call_info_table_create();
13
-
14
-
15
- /* ======= prof_call_info_t ========*/
16
- prof_call_info_t *
17
- prof_call_info_create(prof_method_t* method, prof_call_info_t* parent)
18
- {
19
- prof_call_info_t *result = ALLOC(prof_call_info_t);
20
- result->object = Qnil;
21
- result->target = method;
22
- result->parent = parent;
23
- result->call_infos = call_info_table_create();
24
- result->children = Qnil;
25
-
26
- result->total_time = 0;
27
- result->self_time = 0;
28
- result->wait_time = 0;
29
-
30
- result->called = 0;
31
-
32
- result->recursive = 0;
33
- result->depth = 0;
34
- result->line = 0;
35
-
36
- return result;
37
- }
38
- static void
39
- prof_call_info_ruby_gc_free(prof_call_info_t *call_info)
40
- {
41
- /* Has this thread object been accessed by Ruby? If
42
- yes clean it up so to avoid a segmentation fault. */
43
- if (call_info->object != Qnil)
44
- {
45
- RDATA(call_info->object)->data = NULL;
46
- RDATA(call_info->object)->dfree = NULL;
47
- RDATA(call_info->object)->dmark = NULL;
48
- }
49
- call_info->object = Qnil;
50
- }
51
-
52
- static void
53
- prof_call_info_free(prof_call_info_t *call_info)
54
- {
55
- prof_call_info_ruby_gc_free(call_info);
56
- st_free_table(call_info->call_infos);
57
- xfree(call_info);
58
- }
59
-
60
- static void
61
- prof_call_info_mark(prof_call_info_t *call_info)
62
- {
63
- if (call_info->object)
64
- rb_gc_mark(call_info->object);
65
-
66
- if (call_info->children)
67
- rb_gc_mark(call_info->children);
68
-
69
- /* We don't mark the call info child table since that will be done
70
- via the appropriate method */
71
- }
72
-
73
- VALUE
74
- prof_call_info_wrap(prof_call_info_t *call_info)
75
- {
76
- if (call_info->object == Qnil)
77
- {
78
- call_info->object = Data_Wrap_Struct(cCallInfo, prof_call_info_mark, prof_call_info_ruby_gc_free, call_info);
79
- }
80
- return call_info->object;
81
- }
82
-
83
- static prof_call_info_t *
84
- prof_get_call_info(VALUE self)
85
- {
86
- /* Can't use Data_Get_Struct because that triggers the event hook
87
- ending up in endless recursion. */
88
- prof_call_info_t* result = DATA_PTR(self);
89
-
90
- if (!result)
91
- rb_raise(rb_eRuntimeError, "This RubyProf::CallInfo instance has already been freed, likely because its profile has been freed.");
92
-
93
- return result;
94
- }
95
-
96
- /* ======= Call Info Table ========*/
97
- st_table *
98
- call_info_table_create()
99
- {
100
- return st_init_table(&type_method_hash);
101
- }
102
-
103
- size_t
104
- call_info_table_insert(st_table *table, const prof_method_key_t *key, prof_call_info_t *val)
105
- {
106
- return st_insert(table, (st_data_t) key, (st_data_t) val);
107
- }
108
-
109
- prof_call_info_t *
110
- call_info_table_lookup(st_table *table, const prof_method_key_t *key)
111
- {
112
- st_data_t val;
113
- if (st_lookup(table, (st_data_t) key, &val))
114
- {
115
- return (prof_call_info_t *) val;
116
- }
117
- else
118
- {
119
- return NULL;
120
- }
121
- }
122
-
123
-
124
- /* ======= RubyProf::CallInfo ========*/
125
-
126
- /* Document-class: RubyProf::CallInfo
127
- RubyProf::CallInfo is a helper class used by RubyProf::MethodInfo
128
- to keep track of which child methods were called and how long
129
- they took to execute. */
130
-
131
-
132
- /* call-seq:
133
- called -> MethodInfo
134
-
135
- Returns the target method. */
136
- static VALUE
137
- prof_call_info_target(VALUE self)
138
- {
139
- /* Target is a pointer to a method_info - so we have to be careful
140
- about the GC. We will wrap the method_info but provide no
141
- free method so the underlying object is not freed twice! */
142
-
143
- prof_call_info_t *result = prof_get_call_info(self);
144
- return prof_method_wrap(result->target);
145
- }
146
-
147
- /* call-seq:
148
- called -> int
149
-
150
- Returns the total amount of times this method was called. */
151
- static VALUE
152
- prof_call_info_called(VALUE self)
153
- {
154
- prof_call_info_t *result = prof_get_call_info(self);
155
- return INT2NUM(result->called);
156
- }
157
-
158
- /* call-seq:
159
- called=n -> n
160
-
161
- Sets the call count to n. */
162
- static VALUE
163
- prof_call_info_set_called(VALUE self, VALUE called)
164
- {
165
- prof_call_info_t *result = prof_get_call_info(self);
166
- result->called = NUM2INT(called);
167
- return called;
168
- }
169
-
170
- /* call-seq:
171
- recursive? -> boolean
172
-
173
- Returns the true if this call info is a recursive invocation */
174
- static VALUE
175
- prof_call_info_recursive(VALUE self)
176
- {
177
- prof_call_info_t *result = prof_get_call_info(self);
178
- return result->recursive ? Qtrue : Qfalse;
179
- }
180
-
181
- /* call-seq:
182
- depth -> int
183
-
184
- returns the depth of this call info in the call graph */
185
- static VALUE
186
- prof_call_info_depth(VALUE self)
187
- {
188
- prof_call_info_t *result = prof_get_call_info(self);
189
- return rb_int_new(result->depth);
190
- }
191
-
192
- /* call-seq:
193
- line_no -> int
194
-
195
- returns the line number of the method */
196
- static VALUE
197
- prof_call_info_line(VALUE self)
198
- {
199
- prof_call_info_t *result = prof_get_call_info(self);
200
- return rb_int_new(result->line);
201
- }
202
-
203
- /* call-seq:
204
- total_time -> float
205
-
206
- Returns the total amount of time spent in this method and its children. */
207
- static VALUE
208
- prof_call_info_total_time(VALUE self)
209
- {
210
- prof_call_info_t *result = prof_get_call_info(self);
211
- return rb_float_new(result->total_time);
212
- }
213
-
214
- /* call-seq:
215
- add_total_time(call_info) -> nil
216
-
217
- adds total time time from call_info to self. */
218
- static VALUE
219
- prof_call_info_add_total_time(VALUE self, VALUE other)
220
- {
221
- prof_call_info_t *result = prof_get_call_info(self);
222
- prof_call_info_t *other_info = prof_get_call_info(other);
223
-
224
- result->total_time += other_info->total_time;
225
- return Qnil;
226
- }
227
-
228
- /* call-seq:
229
- self_time -> float
230
-
231
- Returns the total amount of time spent in this method. */
232
- static VALUE
233
- prof_call_info_self_time(VALUE self)
234
- {
235
- prof_call_info_t *result = prof_get_call_info(self);
236
-
237
- return rb_float_new(result->self_time);
238
- }
239
-
240
- /* call-seq:
241
- add_self_time(call_info) -> nil
242
-
243
- adds self time from call_info to self. */
244
- static VALUE
245
- prof_call_info_add_self_time(VALUE self, VALUE other)
246
- {
247
- prof_call_info_t *result = prof_get_call_info(self);
248
- prof_call_info_t *other_info = prof_get_call_info(other);
249
-
250
- result->self_time += other_info->self_time;
251
- return Qnil;
252
- }
253
-
254
- /* call-seq:
255
- wait_time -> float
256
-
257
- Returns the total amount of time this method waited for other threads. */
258
- static VALUE
259
- prof_call_info_wait_time(VALUE self)
260
- {
261
- prof_call_info_t *result = prof_get_call_info(self);
262
-
263
- return rb_float_new(result->wait_time);
264
- }
265
-
266
- /* call-seq:
267
- add_wait_time(call_info) -> nil
268
-
269
- adds wait time from call_info to self. */
270
-
271
- static VALUE
272
- prof_call_info_add_wait_time(VALUE self, VALUE other)
273
- {
274
- prof_call_info_t *result = prof_get_call_info(self);
275
- prof_call_info_t *other_info = prof_get_call_info(other);
276
-
277
- result->wait_time += other_info->wait_time;
278
- return Qnil;
279
- }
280
-
281
- /* call-seq:
282
- parent -> call_info
283
-
284
- Returns the call_infos parent call_info object (the method that called this method).*/
285
- static VALUE
286
- prof_call_info_parent(VALUE self)
287
- {
288
- prof_call_info_t *result = prof_get_call_info(self);
289
- if (result->parent)
290
- return prof_call_info_wrap(result->parent);
291
- else
292
- return Qnil;
293
- }
294
-
295
- /* call-seq:
296
- parent=new_parent -> new_parent
297
-
298
- Changes the parent of self to new_parent and returns it.*/
299
- static VALUE
300
- prof_call_info_set_parent(VALUE self, VALUE new_parent)
301
- {
302
- prof_call_info_t *result = prof_get_call_info(self);
303
- if (new_parent == Qnil)
304
- result->parent = NULL;
305
- else
306
- result->parent = prof_get_call_info(new_parent);
307
- return prof_call_info_parent(self);
308
- }
309
-
310
- static int
311
- prof_call_info_collect_children(st_data_t key, st_data_t value, st_data_t result)
312
- {
313
- prof_call_info_t *call_info = (prof_call_info_t *) value;
314
- VALUE arr = (VALUE) result;
315
- rb_ary_push(arr, prof_call_info_wrap(call_info));
316
- return ST_CONTINUE;
317
- }
318
-
319
- /* call-seq:
320
- children -> hash
321
-
322
- Returns an array of call info objects of methods that this method
323
- called (ie, children).*/
324
- static VALUE
325
- prof_call_info_children(VALUE self)
326
- {
327
- prof_call_info_t *call_info = prof_get_call_info(self);
328
- if (call_info->children == Qnil)
329
- {
330
- call_info->children = rb_ary_new();
331
- st_foreach(call_info->call_infos, prof_call_info_collect_children, call_info->children);
332
- }
333
- return call_info->children;
334
- }
335
-
336
- /* ======= Call Infos ========*/
337
- prof_call_infos_t*
338
- prof_call_infos_create()
339
- {
340
- prof_call_infos_t *result = ALLOC(prof_call_infos_t);
341
- result->start = ALLOC_N(prof_call_info_t*, INITIAL_CALL_INFOS_SIZE);
342
- result->end = result->start + INITIAL_CALL_INFOS_SIZE;
343
- result->ptr = result->start;
344
- result->object = Qnil;
345
- return result;
346
- }
347
-
348
- void
349
- prof_call_infos_mark(prof_call_infos_t *call_infos)
350
- {
351
- prof_call_info_t **call_info;
352
-
353
- if (call_infos->object)
354
- rb_gc_mark(call_infos->object);
355
-
356
- for(call_info=call_infos->start; call_info<call_infos->ptr; call_info++)
357
- {
358
- prof_call_info_mark(*call_info);
359
- }
360
- }
361
-
362
- void
363
- prof_call_infos_free(prof_call_infos_t *call_infos)
364
- {
365
- prof_call_info_t **call_info;
366
-
367
- for(call_info=call_infos->start; call_info<call_infos->ptr; call_info++)
368
- {
369
- prof_call_info_free(*call_info);
370
- }
371
- }
372
-
373
- void
374
- prof_add_call_info(prof_call_infos_t *call_infos, prof_call_info_t *call_info)
375
- {
376
- if (call_infos->ptr == call_infos->end)
377
- {
378
- size_t len = call_infos->ptr - call_infos->start;
379
- size_t new_capacity = (call_infos->end - call_infos->start) * 2;
380
- REALLOC_N(call_infos->start, prof_call_info_t*, new_capacity);
381
- call_infos->ptr = call_infos->start + len;
382
- call_infos->end = call_infos->start + new_capacity;
383
- }
384
- *call_infos->ptr = call_info;
385
- call_infos->ptr++;
386
- }
387
-
388
- VALUE
389
- prof_call_infos_wrap(prof_call_infos_t *call_infos)
390
- {
391
- if (call_infos->object == Qnil)
392
- {
393
- prof_call_info_t **i;
394
- call_infos->object = rb_ary_new();
395
- for(i=call_infos->start; i<call_infos->ptr; i++)
396
- {
397
- VALUE call_info = prof_call_info_wrap(*i);
398
- rb_ary_push(call_infos->object, call_info);
399
- }
400
- }
401
- return call_infos->object;
402
- }
403
-
404
- void rp_init_call_info()
405
- {
406
- /* CallInfo */
407
- cCallInfo = rb_define_class_under(mProf, "CallInfo", rb_cObject);
408
- rb_undef_method(CLASS_OF(cCallInfo), "new");
409
- rb_define_method(cCallInfo, "parent", prof_call_info_parent, 0);
410
- rb_define_method(cCallInfo, "parent=", prof_call_info_set_parent, 1);
411
- rb_define_method(cCallInfo, "children", prof_call_info_children, 0);
412
- rb_define_method(cCallInfo, "target", prof_call_info_target, 0);
413
- rb_define_method(cCallInfo, "called", prof_call_info_called, 0);
414
- rb_define_method(cCallInfo, "called=", prof_call_info_set_called, 1);
415
- rb_define_method(cCallInfo, "total_time", prof_call_info_total_time, 0);
416
- rb_define_method(cCallInfo, "add_total_time", prof_call_info_add_total_time, 1);
417
- rb_define_method(cCallInfo, "self_time", prof_call_info_self_time, 0);
418
- rb_define_method(cCallInfo, "add_self_time", prof_call_info_add_self_time, 1);
419
- rb_define_method(cCallInfo, "wait_time", prof_call_info_wait_time, 0);
420
- rb_define_method(cCallInfo, "add_wait_time", prof_call_info_add_wait_time, 1);
421
-
422
- rb_define_method(cCallInfo, "recursive?", prof_call_info_recursive, 0);
423
- rb_define_method(cCallInfo, "depth", prof_call_info_depth, 0);
424
- rb_define_method(cCallInfo, "line", prof_call_info_line, 0);
425
- }
@@ -1,53 +0,0 @@
1
- /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- #ifndef __RP_CALL_INFO_H__
5
- #define __RP_CALL_INFO_H__
6
-
7
- #include "rp_measure.h"
8
- #include "rp_method.h"
9
-
10
- extern VALUE cCallInfo;
11
-
12
- /* Callers and callee information for a method. */
13
- typedef struct prof_call_info_t
14
- {
15
- prof_method_t *target; /* Use target instead of method to avoid conflict with Ruby method */
16
- struct prof_call_info_t *parent;
17
- st_table *call_infos;
18
-
19
- double total_time;
20
- double self_time;
21
- double wait_time;
22
-
23
- VALUE object;
24
- VALUE children;
25
-
26
- int called;
27
-
28
- unsigned int recursive : 1;
29
- unsigned int depth : 15;
30
- unsigned int line : 16;
31
- } prof_call_info_t;
32
-
33
- /* Array of call_info objects */
34
- typedef struct prof_call_infos_t
35
- {
36
- prof_call_info_t **start;
37
- prof_call_info_t **end;
38
- prof_call_info_t **ptr;
39
- VALUE object;
40
- } prof_call_infos_t;
41
-
42
-
43
- void rp_init_call_info(void);
44
- prof_call_infos_t* prof_call_infos_create();
45
- void prof_call_infos_mark(prof_call_infos_t *call_infos);
46
- void prof_call_infos_free(prof_call_infos_t *call_infos);
47
- void prof_add_call_info(prof_call_infos_t *call_infos, prof_call_info_t *call_info);
48
- VALUE prof_call_infos_wrap(prof_call_infos_t *call_infos);
49
- prof_call_info_t * prof_call_info_create(prof_method_t* method, prof_call_info_t* parent);
50
- prof_call_info_t * call_info_table_lookup(st_table *table, const prof_method_key_t *key);
51
- size_t call_info_table_insert(st_table *table, const prof_method_key_t *key, prof_call_info_t *val);
52
-
53
- #endif //__RP_CALL_INFO_H__