Ruby: debug_counter.h Source File

Ruby 3.0.5p211 (2022-11-24 revision ba5cf0f7c52d4d35cc6a173c89eda98ceffa2dcf)

debug_counter.h
Go to the documentation of this file.
1/**********************************************************************
2
3 debug_counter.h -
4
5 created at: Tue Feb 21 16:51:18 2017
6
7 Copyright (C) 2017 Koichi Sasada
8
9**********************************************************************/
10
11#ifndef USE_DEBUG_COUNTER
12#define USE_DEBUG_COUNTER 0
13#endif
14
15#ifdef RB_DEBUG_COUNTER
16
17// method cache (IMC: inline method cache)
18 RB_DEBUG_COUNTER(mc_inline_hit) // IMC hit
19 RB_DEBUG_COUNTER(mc_inline_miss_klass) // IMC miss by different class
20 RB_DEBUG_COUNTER(mc_inline_miss_invalidated) // IMC miss by invalidated ME
21 RB_DEBUG_COUNTER(mc_inline_miss_empty) // IMC miss because prev is empty slot
22 RB_DEBUG_COUNTER(mc_inline_miss_same_cc) // IMC miss, but same CC
23 RB_DEBUG_COUNTER(mc_inline_miss_same_cme) // IMC miss, but same CME
24 RB_DEBUG_COUNTER(mc_inline_miss_same_def) // IMC miss, but same definition
25 RB_DEBUG_COUNTER(mc_inline_miss_diff) // IMC miss, different methods
26
27 RB_DEBUG_COUNTER(mc_cme_complement) // number of acquiring complement CME
28 RB_DEBUG_COUNTER(mc_cme_complement_hit) // number of cache hit for complemented CME
29
30 RB_DEBUG_COUNTER(mc_search) // count for method lookup in class tree
31 RB_DEBUG_COUNTER(mc_search_notfound) // method lookup, but not found
32 RB_DEBUG_COUNTER(mc_search_super) // total traversed classes
33
34// callinfo
35 RB_DEBUG_COUNTER(ci_packed) // number of packed CI
36 RB_DEBUG_COUNTER(ci_kw) // non-packed CI w/ keywords
37 RB_DEBUG_COUNTER(ci_nokw) // non-packed CI w/o keywords
38 RB_DEBUG_COUNTER(ci_runtime) // creating temporary CI
39
40// callcache
41 RB_DEBUG_COUNTER(cc_new) // number of CC
42 RB_DEBUG_COUNTER(cc_temp) // dummy CC (stack-allocated)
43 RB_DEBUG_COUNTER(cc_found_in_ccs) // count for CC lookup success in CCS
44 RB_DEBUG_COUNTER(cc_not_found_in_ccs) // count for CC lookup success in CCS
45
46 RB_DEBUG_COUNTER(cc_ent_invalidate) // count for invalidating cc (cc->klass = 0)
47 RB_DEBUG_COUNTER(cc_cme_invalidate) // count for invalidating CME
48
49 RB_DEBUG_COUNTER(cc_invalidate_leaf) // count for invalidating klass if klass has no-sublcasses
50 RB_DEBUG_COUNTER(cc_invalidate_leaf_ccs) // corresponding CCS
51 RB_DEBUG_COUNTER(cc_invalidate_leaf_callable) // complimented cache (no-subclasses)
52 RB_DEBUG_COUNTER(cc_invalidate_tree) // count for invalidating klass if klass has sublcasses
53 RB_DEBUG_COUNTER(cc_invalidate_tree_cme) // cme if cme is found in this class or superclasses
54 RB_DEBUG_COUNTER(cc_invalidate_tree_callable) // complimented cache (subclasses)
55 RB_DEBUG_COUNTER(cc_invalidate_negative) // count for invalidating negative cache
56
57 RB_DEBUG_COUNTER(ccs_free) // count for free'ing ccs
58 RB_DEBUG_COUNTER(ccs_maxlen) // maximum length of ccs
59 RB_DEBUG_COUNTER(ccs_found) // count for finding corresponding ccs on method lookup
60 RB_DEBUG_COUNTER(ccs_not_found) // count for not found corresponding ccs on method lookup
61
62// vm_eval.c
63 RB_DEBUG_COUNTER(call0_public)
64 RB_DEBUG_COUNTER(call0_other)
65 RB_DEBUG_COUNTER(gccct_hit)
66 RB_DEBUG_COUNTER(gccct_miss)
67 RB_DEBUG_COUNTER(gccct_null)
68
69// iseq
70 RB_DEBUG_COUNTER(iseq_num) // number of total created iseq
71 RB_DEBUG_COUNTER(iseq_cd_num) // number of total created cd (call_data)
72
73/*
74 * call cache fastpath usage
75 */
76 RB_DEBUG_COUNTER(ccf_general)
77 RB_DEBUG_COUNTER(ccf_iseq_setup)
78 RB_DEBUG_COUNTER(ccf_iseq_setup_0start)
79 RB_DEBUG_COUNTER(ccf_iseq_setup_tailcall_0start)
80 RB_DEBUG_COUNTER(ccf_iseq_fix) /* several functions created with tool/mk_call_iseq_optimized.rb */
81 RB_DEBUG_COUNTER(ccf_iseq_opt) /* has_opt == TRUE (has optional parameters), but other flags are FALSE */
82 RB_DEBUG_COUNTER(ccf_iseq_kw1) /* vm_call_iseq_setup_kwparm_kwarg() */
83 RB_DEBUG_COUNTER(ccf_iseq_kw2) /* vm_call_iseq_setup_kwparm_nokwarg() */
84 RB_DEBUG_COUNTER(ccf_cfunc)
85 RB_DEBUG_COUNTER(ccf_cfunc_with_frame)
86 RB_DEBUG_COUNTER(ccf_ivar) /* attr_reader */
87 RB_DEBUG_COUNTER(ccf_attrset) /* attr_writer */
88 RB_DEBUG_COUNTER(ccf_method_missing)
89 RB_DEBUG_COUNTER(ccf_zsuper)
90 RB_DEBUG_COUNTER(ccf_bmethod)
91 RB_DEBUG_COUNTER(ccf_opt_send)
92 RB_DEBUG_COUNTER(ccf_opt_call)
93 RB_DEBUG_COUNTER(ccf_opt_block_call)
94 RB_DEBUG_COUNTER(ccf_super_method)
95
96/*
97 * control frame push counts.
98 *
99 * * frame_push: frame push counts.
100 * * frame_push_*: frame push counts per each type.
101 * * frame_R2R: Ruby frame to Ruby frame
102 * * frame_R2C: Ruby frame to C frame
103 * * frame_C2C: C frame to C frame
104 * * frame_C2R: C frame to Ruby frame
105 */
106 RB_DEBUG_COUNTER(frame_push)
107 RB_DEBUG_COUNTER(frame_push_method)
108 RB_DEBUG_COUNTER(frame_push_block)
109 RB_DEBUG_COUNTER(frame_push_class)
110 RB_DEBUG_COUNTER(frame_push_top)
111 RB_DEBUG_COUNTER(frame_push_cfunc)
112 RB_DEBUG_COUNTER(frame_push_ifunc)
113 RB_DEBUG_COUNTER(frame_push_eval)
114 RB_DEBUG_COUNTER(frame_push_rescue)
115 RB_DEBUG_COUNTER(frame_push_dummy)
116
117 RB_DEBUG_COUNTER(frame_R2R)
118 RB_DEBUG_COUNTER(frame_R2C)
119 RB_DEBUG_COUNTER(frame_C2C)
120 RB_DEBUG_COUNTER(frame_C2R)
121
122/* instance variable counts
123 *
124 * * ivar_get_ic_hit/miss: ivar_get inline cache (ic) hit/miss counts (VM insn)
125 * * ivar_get_ic_miss_serial: ivar_get ic miss reason by serial (VM insn)
126 * * ivar_get_ic_miss_unset: ... by unset (VM insn)
127 * * ivar_get_ic_miss_noobject: ... by "not T_OBJECT" (VM insn)
128 * * ivar_set_...: same counts with ivar_set (VM insn)
129 * * ivar_get/set_base: call counts of "rb_ivar_get/set()".
130 * because of (1) ic miss.
131 * (2) direct call by C extensions.
132 */
133 RB_DEBUG_COUNTER(ivar_get_ic_hit)
134 RB_DEBUG_COUNTER(ivar_get_ic_miss)
135 RB_DEBUG_COUNTER(ivar_get_ic_miss_serial)
136 RB_DEBUG_COUNTER(ivar_get_ic_miss_unset)
137 RB_DEBUG_COUNTER(ivar_get_ic_miss_noobject)
138 RB_DEBUG_COUNTER(ivar_set_ic_hit)
139 RB_DEBUG_COUNTER(ivar_set_ic_miss)
140 RB_DEBUG_COUNTER(ivar_set_ic_miss_serial)
141 RB_DEBUG_COUNTER(ivar_set_ic_miss_unset)
142 RB_DEBUG_COUNTER(ivar_set_ic_miss_iv_hit)
143 RB_DEBUG_COUNTER(ivar_set_ic_miss_noobject)
144 RB_DEBUG_COUNTER(ivar_get_base)
145 RB_DEBUG_COUNTER(ivar_set_base)
146
147/* local variable counts
148 *
149 * * lvar_get: total lvar get counts (VM insn)
150 * * lvar_get_dynamic: lvar get counts if accessing upper env (VM insn)
151 * * lvar_set*: same as "get"
152 * * lvar_set_slowpath: counts using vm_env_write_slowpath()
153 */
154 RB_DEBUG_COUNTER(lvar_get)
155 RB_DEBUG_COUNTER(lvar_get_dynamic)
156 RB_DEBUG_COUNTER(lvar_set)
157 RB_DEBUG_COUNTER(lvar_set_dynamic)
158 RB_DEBUG_COUNTER(lvar_set_slowpath)
159
160/* GC counts:
161 *
162 * * count: simple count
163 * * _minor: minor gc
164 * * _major: major gc
165 * * other suffix is corresponding to last_gc_info or
166 * gc_profile_record_flag in gc.c.
167 */
168 RB_DEBUG_COUNTER(gc_count)
169 RB_DEBUG_COUNTER(gc_minor_newobj)
170 RB_DEBUG_COUNTER(gc_minor_malloc)
171 RB_DEBUG_COUNTER(gc_minor_method)
172 RB_DEBUG_COUNTER(gc_minor_capi)
173 RB_DEBUG_COUNTER(gc_minor_stress)
174 RB_DEBUG_COUNTER(gc_major_nofree)
175 RB_DEBUG_COUNTER(gc_major_oldgen)
176 RB_DEBUG_COUNTER(gc_major_shady)
177 RB_DEBUG_COUNTER(gc_major_force)
178 RB_DEBUG_COUNTER(gc_major_oldmalloc)
179
180 RB_DEBUG_COUNTER(gc_enter_start)
181 RB_DEBUG_COUNTER(gc_enter_mark_continue)
182 RB_DEBUG_COUNTER(gc_enter_sweep_continue)
183 RB_DEBUG_COUNTER(gc_enter_rest)
184 RB_DEBUG_COUNTER(gc_enter_finalizer)
185
186 RB_DEBUG_COUNTER(gc_isptr_trial)
187 RB_DEBUG_COUNTER(gc_isptr_range)
188 RB_DEBUG_COUNTER(gc_isptr_align)
189 RB_DEBUG_COUNTER(gc_isptr_maybe)
190
191/* object allocation counts:
192 *
193 * * obj_newobj: newobj counts
194 * * obj_newobj_slowpath: newobj with slowpath counts
195 * * obj_newobj_wb_unprotected: newobj for wb_unprotected.
196 * * obj_free: obj_free() counts
197 * * obj_promote: promoted counts (oldgen)
198 * * obj_wb_unprotect: wb unprotect counts
199 *
200 * * obj_[type]_[attr]: *free'ed counts* for each type.
201 * Note that it is not a allocated counts.
202 * * [type]
203 * * _obj: T_OBJECT
204 * * _str: T_STRING
205 * * _ary: T_ARRAY
206 * * _xxx: T_XXX (hash, struct, ...)
207 *
208 * * [attr]
209 * * _ptr: R?? is not embed.
210 * * _embed: R?? is embed.
211 * * _transient: R?? uses transient heap.
212 * * type specific attr.
213 * * str_shared: str is shared.
214 * * str_nofree: nofree
215 * * str_fstr: fstr
216 * * hash_empty: hash is empty
217 * * hash_1_4: has 1 to 4 entries
218 * * hash_5_8: has 5 to 8 entries
219 * * hash_g8: has n entries (n>8)
220 * * match_under4: has under 4 oniguruma regions allocated
221 * * match_ge4: has n regions allocated (4<=n<8)
222 * * match_ge8: has n regions allocated (8<=n)
223 * * data_empty: T_DATA but no memory free.
224 * * data_xfree: free'ed by xfree().
225 * * data_imm_free: free'ed immediately.
226 * * data_zombie: free'ed with zombie.
227 * * imemo_*: T_IMEMO with each type.
228 */
229 RB_DEBUG_COUNTER(obj_newobj)
230 RB_DEBUG_COUNTER(obj_newobj_slowpath)
231 RB_DEBUG_COUNTER(obj_newobj_wb_unprotected)
232 RB_DEBUG_COUNTER(obj_free)
233 RB_DEBUG_COUNTER(obj_promote)
234 RB_DEBUG_COUNTER(obj_wb_unprotect)
235
236 RB_DEBUG_COUNTER(obj_obj_embed)
237 RB_DEBUG_COUNTER(obj_obj_transient)
238 RB_DEBUG_COUNTER(obj_obj_ptr)
239
240 RB_DEBUG_COUNTER(obj_str_ptr)
241 RB_DEBUG_COUNTER(obj_str_embed)
242 RB_DEBUG_COUNTER(obj_str_shared)
243 RB_DEBUG_COUNTER(obj_str_nofree)
244 RB_DEBUG_COUNTER(obj_str_fstr)
245
246 RB_DEBUG_COUNTER(obj_ary_embed)
247 RB_DEBUG_COUNTER(obj_ary_transient)
248 RB_DEBUG_COUNTER(obj_ary_ptr)
249 RB_DEBUG_COUNTER(obj_ary_extracapa)
250/*
251 ary_shared_create: shared ary by Array#dup and so on.
252 ary_shared: finished in shard.
253 ary_shared_root_occupied: shared_root but has only 1 refcnt.
254 The number (ary_shared - ary_shared_root_occupied) is meaningful.
255 */
256 RB_DEBUG_COUNTER(obj_ary_shared_create)
257 RB_DEBUG_COUNTER(obj_ary_shared)
258 RB_DEBUG_COUNTER(obj_ary_shared_root_occupied)
259
260 RB_DEBUG_COUNTER(obj_hash_empty)
261 RB_DEBUG_COUNTER(obj_hash_1)
262 RB_DEBUG_COUNTER(obj_hash_2)
263 RB_DEBUG_COUNTER(obj_hash_3)
264 RB_DEBUG_COUNTER(obj_hash_4)
265 RB_DEBUG_COUNTER(obj_hash_5_8)
266 RB_DEBUG_COUNTER(obj_hash_g8)
267
268 RB_DEBUG_COUNTER(obj_hash_null)
269 RB_DEBUG_COUNTER(obj_hash_ar)
270 RB_DEBUG_COUNTER(obj_hash_st)
271 RB_DEBUG_COUNTER(obj_hash_transient)
272 RB_DEBUG_COUNTER(obj_hash_force_convert)
273
274 RB_DEBUG_COUNTER(obj_struct_embed)
275 RB_DEBUG_COUNTER(obj_struct_transient)
276 RB_DEBUG_COUNTER(obj_struct_ptr)
277
278 RB_DEBUG_COUNTER(obj_data_empty)
279 RB_DEBUG_COUNTER(obj_data_xfree)
280 RB_DEBUG_COUNTER(obj_data_imm_free)
281 RB_DEBUG_COUNTER(obj_data_zombie)
282
283 RB_DEBUG_COUNTER(obj_match_under4)
284 RB_DEBUG_COUNTER(obj_match_ge4)
285 RB_DEBUG_COUNTER(obj_match_ge8)
286 RB_DEBUG_COUNTER(obj_match_ptr)
287
288 RB_DEBUG_COUNTER(obj_iclass_ptr)
289 RB_DEBUG_COUNTER(obj_class_ptr)
290 RB_DEBUG_COUNTER(obj_module_ptr)
291
292 RB_DEBUG_COUNTER(obj_bignum_ptr)
293 RB_DEBUG_COUNTER(obj_bignum_embed)
294 RB_DEBUG_COUNTER(obj_float)
295 RB_DEBUG_COUNTER(obj_complex)
296 RB_DEBUG_COUNTER(obj_rational)
297
298 RB_DEBUG_COUNTER(obj_regexp_ptr)
299 RB_DEBUG_COUNTER(obj_file_ptr)
300 RB_DEBUG_COUNTER(obj_symbol)
301
302 RB_DEBUG_COUNTER(obj_imemo_ment)
303 RB_DEBUG_COUNTER(obj_imemo_iseq)
304 RB_DEBUG_COUNTER(obj_imemo_env)
305 RB_DEBUG_COUNTER(obj_imemo_tmpbuf)
306 RB_DEBUG_COUNTER(obj_imemo_ast)
307 RB_DEBUG_COUNTER(obj_imemo_cref)
308 RB_DEBUG_COUNTER(obj_imemo_svar)
309 RB_DEBUG_COUNTER(obj_imemo_throw_data)
310 RB_DEBUG_COUNTER(obj_imemo_ifunc)
311 RB_DEBUG_COUNTER(obj_imemo_memo)
312 RB_DEBUG_COUNTER(obj_imemo_parser_strterm)
313 RB_DEBUG_COUNTER(obj_imemo_callinfo)
314 RB_DEBUG_COUNTER(obj_imemo_callcache)
315 RB_DEBUG_COUNTER(obj_imemo_constcache)
316
317/* ar_table */
318 RB_DEBUG_COUNTER(artable_hint_hit)
319 RB_DEBUG_COUNTER(artable_hint_miss)
320 RB_DEBUG_COUNTER(artable_hint_notfound)
321
322/* heap function counts
323 *
324 * * heap_xmalloc/realloc/xfree: call counts
325 */
326 RB_DEBUG_COUNTER(heap_xmalloc)
327 RB_DEBUG_COUNTER(heap_xrealloc)
328 RB_DEBUG_COUNTER(heap_xfree)
329
330/* transient_heap */
331 RB_DEBUG_COUNTER(theap_alloc)
332 RB_DEBUG_COUNTER(theap_alloc_fail)
333 RB_DEBUG_COUNTER(theap_evacuate)
334
335// VM sync
336 RB_DEBUG_COUNTER(vm_sync_lock)
337 RB_DEBUG_COUNTER(vm_sync_lock_enter)
338 RB_DEBUG_COUNTER(vm_sync_lock_enter_nb)
339 RB_DEBUG_COUNTER(vm_sync_lock_enter_cr)
340 RB_DEBUG_COUNTER(vm_sync_barrier)
341
342/* mjit_exec() counts */
343 RB_DEBUG_COUNTER(mjit_exec)
344 RB_DEBUG_COUNTER(mjit_exec_not_added)
345 RB_DEBUG_COUNTER(mjit_exec_not_ready)
346 RB_DEBUG_COUNTER(mjit_exec_not_compiled)
347 RB_DEBUG_COUNTER(mjit_exec_call_func)
348
349/* MJIT enqueue / unload */
350 RB_DEBUG_COUNTER(mjit_add_iseq_to_process)
351 RB_DEBUG_COUNTER(mjit_unload_units)
352
353/* MJIT <-> VM frame push counts */
354 RB_DEBUG_COUNTER(mjit_frame_VM2VM)
355 RB_DEBUG_COUNTER(mjit_frame_VM2JT)
356 RB_DEBUG_COUNTER(mjit_frame_JT2JT)
357 RB_DEBUG_COUNTER(mjit_frame_JT2VM)
358
359/* MJIT cancel counters */
360 RB_DEBUG_COUNTER(mjit_cancel)
361 RB_DEBUG_COUNTER(mjit_cancel_ivar_inline)
362 RB_DEBUG_COUNTER(mjit_cancel_exivar_inline)
363 RB_DEBUG_COUNTER(mjit_cancel_send_inline)
364 RB_DEBUG_COUNTER(mjit_cancel_opt_insn) /* CALL_SIMPLE_METHOD */
365 RB_DEBUG_COUNTER(mjit_cancel_invalidate_all)
366 RB_DEBUG_COUNTER(mjit_cancel_leave)
367
368/* rb_mjit_unit_list length */
369 RB_DEBUG_COUNTER(mjit_length_unit_queue)
370 RB_DEBUG_COUNTER(mjit_length_active_units)
371 RB_DEBUG_COUNTER(mjit_length_compact_units)
372 RB_DEBUG_COUNTER(mjit_length_stale_units)
373
374/* Other MJIT counters */
375 RB_DEBUG_COUNTER(mjit_compile_failures)
376
377/* load (not implemented yet) */
378/*
379RB_DEBUG_COUNTER(load_files)
380RB_DEBUG_COUNTER(load_path_is_not_realpath)
381*/
382#endif
383
384#ifndef RUBY_DEBUG_COUNTER_H
385#define RUBY_DEBUG_COUNTER_H 1
386
387#include "ruby/internal/config.h"
388#include <stddef.h> /* for size_t */
389#include "ruby/ruby.h" /* for VALUE */
390
391#if !defined(__GNUC__) && USE_DEBUG_COUNTER
392#error "USE_DEBUG_COUNTER is not supported by other than __GNUC__"
393#endif
394
395 enum rb_debug_counter_type {
396#define RB_DEBUG_COUNTER(name) RB_DEBUG_COUNTER_##name,
397#include __FILE__
398 RB_DEBUG_COUNTER_MAX
399#undef RB_DEBUG_COUNTER
400};
401
402#if USE_DEBUG_COUNTER
403extern size_t rb_debug_counter[];
404 RUBY_EXTERN struct rb_ractor_struct *ruby_single_main_ractor;
405 RUBY_EXTERN void rb_debug_counter_add_atomic(enum rb_debug_counter_type type, int add);
406
407inline static int
408rb_debug_counter_add(enum rb_debug_counter_type type, int add, int cond)
409{
410 if (cond) {
411 if (ruby_single_main_ractor != NULL) {
412 rb_debug_counter[(int)type] += add;
413 }
414 else {
415 rb_debug_counter_add_atomic(type, add);
416 }
417 }
418 return cond;
419}
420
421inline static int
422rb_debug_counter_max(enum rb_debug_counter_type type, unsigned int num)
423{
424 // TODO: sync
425 if (rb_debug_counter[(int)type] < num) {
426 rb_debug_counter[(int)type] = num;
427 return 1;
428 }
429 else {
430 return 0;
431 }
432}
433
434 VALUE rb_debug_counter_reset(VALUE klass);
435 VALUE rb_debug_counter_show(VALUE klass);
436
437#define RB_DEBUG_COUNTER_INC(type) rb_debug_counter_add(RB_DEBUG_COUNTER_##type, 1, 1)
438#define RB_DEBUG_COUNTER_INC_UNLESS(type, cond) (!rb_debug_counter_add(RB_DEBUG_COUNTER_##type, 1, !(cond)))
439#define RB_DEBUG_COUNTER_INC_IF(type, cond) rb_debug_counter_add(RB_DEBUG_COUNTER_##type, 1, !!(cond))
440#define RB_DEBUG_COUNTER_ADD(type, num) rb_debug_counter_add(RB_DEBUG_COUNTER_##type, (num), 1)
441#define RB_DEBUG_COUNTER_SETMAX(type, num) rb_debug_counter_max(RB_DEBUG_COUNTER_##type, (unsigned int)(num))
442
443#else
444#define RB_DEBUG_COUNTER_INC(type) ((void)0)
445#define RB_DEBUG_COUNTER_INC_UNLESS(type, cond) (!!(cond))
446#define RB_DEBUG_COUNTER_INC_IF(type, cond) (!!(cond))
447#define RB_DEBUG_COUNTER_ADD(type, num) ((void)0)
448#define RB_DEBUG_COUNTER_SETMAX(type, num) 0
449#endif
450
451void rb_debug_counter_show_results(const char *msg);
452
453RUBY_SYMBOL_EXPORT_BEGIN
454
455size_t ruby_debug_counter_get(const char **names_ptr, size_t *counters_ptr);
456void ruby_debug_counter_reset(void);
457void ruby_debug_counter_show_at_exit(int enable);
458
459RUBY_SYMBOL_EXPORT_END
460
461#endif /* RUBY_DEBUG_COUNTER_H */
add
#define add(x, y)
Definition: date_strftime.c:23
rb_debug_counter_type
rb_debug_counter_type
Definition: debug_counter.h:395
RB_DEBUG_COUNTER_MAX
@ RB_DEBUG_COUNTER_MAX
Definition: debug_counter.h:398
rb_debug_counter_show_results
void rb_debug_counter_show_results(const char *msg)
Definition: debug_counter.c:141
RB_DEBUG_COUNTER
#define RB_DEBUG_COUNTER(name)
Definition: debug_counter.h:396
ruby_debug_counter_get
size_t ruby_debug_counter_get(const char **names_ptr, size_t *counters_ptr)
Definition: debug_counter.c:146
ruby_debug_counter_show_at_exit
void ruby_debug_counter_show_at_exit(int enable)
Definition: debug_counter.c:156
ruby_debug_counter_reset
void ruby_debug_counter_reset(void)
Definition: debug_counter.c:151
RUBY_EXTERN
#define RUBY_EXTERN
Definition: dllexport.h:36
num
big_t * num
Definition: enough.c:232
config.h
Thin wrapper to ruby/config.h.
int
typedef int(ZCALLBACK *close_file_func) OF((voidpf opaque
ruby::backward::cxxanyargs::type
VALUE type(ANYARGS)
ANYARGS-ed function type.
Definition: cxxanyargs.hpp:56
NULL
#define NULL
Definition: regenc.h:69
ruby.h
rb_ractor_struct
Definition: ractor_core.h:82
VALUE
unsigned long VALUE
Definition: value.h:38
ruby_single_main_ractor
rb_ractor_t * ruby_single_main_ractor
Definition: vm.c:381