19# define VM_CHECK_MODE RUBY_DEBUG
23#ifndef RACTOR_CHECK_MODE
24# define RACTOR_CHECK_MODE (VM_CHECK_MODE || RUBY_DEBUG) && (SIZEOF_UINT64_T == SIZEOF_VALUE)
31typedef int (*vm_table_foreach_callback_func)(
VALUE value,
void *data);
32typedef int (*vm_table_update_callback_func)(
VALUE *value,
void *data);
34enum rb_gc_vm_weak_tables {
36 RB_GC_VM_OVERLOADED_CME_TABLE,
37 RB_GC_VM_GLOBAL_SYMBOLS_TABLE,
38 RB_GC_VM_GENERIC_FIELDS_TABLE,
39 RB_GC_VM_FROZEN_STRINGS_TABLE,
40 RB_GC_VM_WEAK_TABLE_COUNT
43#define RB_GC_VM_LOCK() rb_gc_vm_lock(__FILE__, __LINE__)
44#define RB_GC_VM_UNLOCK(lev) rb_gc_vm_unlock(lev, __FILE__, __LINE__)
45#define RB_GC_VM_LOCK_NO_BARRIER() rb_gc_vm_lock_no_barrier(__FILE__, __LINE__)
46#define RB_GC_VM_UNLOCK_NO_BARRIER(lev) rb_gc_vm_unlock_no_barrier(lev, __FILE__, __LINE__)
53# define MODULAR_GC_FN static
57RUBY_SYMBOL_EXPORT_BEGIN
62size_t rb_size_mul_or_raise(
size_t x,
size_t y,
VALUE exc);
63void rb_objspace_reachable_objects_from(
VALUE obj,
void (func)(
VALUE,
void *),
void *data);
64const char *rb_raw_obj_info(
char *
const buff,
const size_t buff_size,
VALUE obj);
65const char *rb_obj_info(
VALUE obj);
66size_t rb_obj_memsize_of(
VALUE obj);
67bool ruby_free_at_exit_p(
void);
68void rb_objspace_reachable_objects_from_root(
void (func)(
const char *category,
VALUE,
void *),
void *passing_data);
69void rb_gc_verify_shareable(
VALUE);
71MODULAR_GC_FN
unsigned int rb_gc_vm_lock(
const char *file,
int line);
72MODULAR_GC_FN
void rb_gc_vm_unlock(
unsigned int lev,
const char *file,
int line);
73MODULAR_GC_FN
unsigned int rb_gc_vm_lock_no_barrier(
const char *file,
int line);
74MODULAR_GC_FN
void rb_gc_vm_unlock_no_barrier(
unsigned int lev,
const char *file,
int line);
75MODULAR_GC_FN
void rb_gc_vm_barrier(
void);
76MODULAR_GC_FN
void rb_gc_vm_each_objspace(
void (*func)(
void *
objspace,
void *data),
void *data);
77MODULAR_GC_FN
size_t rb_gc_vm_zombie_total_pages(
void);
78MODULAR_GC_FN
unsigned int rb_gc_vm_ractor_count(
void);
79MODULAR_GC_FN
void rb_gc_vm_refresh_zombie_pages(
void);
82bool rb_gc_single_objspace_p(
void);
85void rb_gc_reset_absorbed_since_global_gc(
void);
86MODULAR_GC_FN
size_t rb_gc_obj_optimal_size(
VALUE obj);
87MODULAR_GC_FN
void rb_gc_mark_children(
void *
objspace,
VALUE obj);
88MODULAR_GC_FN
void rb_gc_vm_weak_table_foreach(vm_table_foreach_callback_func callback, vm_table_update_callback_func update_callback,
void *data,
bool weak_only,
enum rb_gc_vm_weak_tables table);
90MODULAR_GC_FN
void rb_gc_vm_generic_fields_mark_foreach(
int (*cb)(
VALUE key,
VALUE val,
void *arg),
void *arg);
91MODULAR_GC_FN
void rb_gc_vm_generic_fields_drain_dead(
bool (*is_dead)(
VALUE key));
93MODULAR_GC_FN
VALUE rb_gc_vm_top_self(
void);
94MODULAR_GC_FN
void rb_gc_update_object_references(
void *
objspace,
VALUE obj);
95MODULAR_GC_FN
void rb_gc_update_vm_references(
void *
objspace);
97MODULAR_GC_FN
void *rb_gc_get_objspace(
void);
98MODULAR_GC_FN
void rb_gc_run_obj_finalizer(
VALUE objid,
long count,
VALUE (*callback)(
long i,
void *data),
void *data);
99MODULAR_GC_FN
void rb_gc_set_pending_interrupt(
void);
101MODULAR_GC_FN
void rb_gc_unset_pending_interrupt(
void);
102MODULAR_GC_FN
void rb_gc_obj_free_vm_weak_references(
VALUE obj);
104MODULAR_GC_FN
void rb_gc_save_machine_context(
void);
105MODULAR_GC_FN
void rb_gc_mark_roots(
void *
objspace,
const char **categoryp);
106MODULAR_GC_FN
bool rb_gc_multi_ractor_p(
void);
107MODULAR_GC_FN
bool rb_gc_ever_multi_ractor_p(
void);
111MODULAR_GC_FN
bool rb_gc_gc_disabled_global_p(
void);
112MODULAR_GC_FN
bool rb_gc_shutdown_call_finalizer_p(
VALUE obj);
113MODULAR_GC_FN
void rb_gc_obj_changed_slot_size(
VALUE obj,
size_t slot_size);
114MODULAR_GC_FN
void rb_gc_prepare_heap_process_object(
VALUE obj);
115MODULAR_GC_FN
bool rb_memerror_reentered(
void);
116MODULAR_GC_FN
bool rb_obj_id_p(
VALUE);
117MODULAR_GC_FN
void rb_gc_before_updating_jit_code(
void);
118MODULAR_GC_FN
void rb_gc_after_updating_jit_code(
void);
119MODULAR_GC_FN
bool rb_gc_obj_shareable_p(
VALUE);
120MODULAR_GC_FN
void rb_gc_rp(
VALUE);
121MODULAR_GC_FN
void rb_gc_handle_weak_references(
VALUE obj);
122MODULAR_GC_FN
bool rb_gc_obj_needs_cleanup_p(
VALUE obj);
127MODULAR_GC_FN
void *rb_gc_get_ractor_newobj_cache(
void);
128MODULAR_GC_FN
void rb_gc_move_obj_during_marking(
VALUE from,
VALUE to);
129MODULAR_GC_FN
void rb_gc_print_backtrace();
133RUBY_SYMBOL_EXPORT_END
136void rb_ractor_finish_marking(
bool full_mark);
141#ifdef BUILDING_MODULAR_GC
154#ifndef RGENGC_CHECK_MODE
155# define RGENGC_CHECK_MODE 0
159# define GC_ASSERT(expr, ...) RUBY_ASSERT_MESG_WHEN(RGENGC_CHECK_MODE > 0, expr, #expr RBIMPL_VA_OPT_ARGS(__VA_ARGS__))
163hash_foreach_replace_value(st_data_t key, st_data_t value, st_data_t argp,
int error)
165 if (rb_gc_location((
VALUE)value) != (
VALUE)value) {
172hash_replace_ref_value(st_data_t *key, st_data_t *value, st_data_t argp,
int existing)
174 rb_gc_update_moved((
VALUE *)value);
180gc_ref_update_table_values_only(
st_table *tbl)
182 if (!tbl || tbl->num_entries == 0)
return;
184 if (st_foreach_with_replace(tbl, hash_foreach_replace_value, hash_replace_ref_value, 0)) {
190gc_mark_tbl_no_pin_i(st_data_t key, st_data_t value, st_data_t data)
192 rb_gc_mark_movable((
VALUE)value);
198gc_mark_set_no_pin_i(st_data_t key, st_data_t value, st_data_t data)
200 rb_gc_mark_movable((
VALUE)key);
206hash_foreach_replace(st_data_t key, st_data_t value, st_data_t argp,
int error)
208 if (rb_gc_location((
VALUE)key) != (
VALUE)key) {
212 if (rb_gc_location((
VALUE)value) != (
VALUE)value) {
220hash_replace_ref(st_data_t *key, st_data_t *value, st_data_t argp,
int existing)
222 rb_gc_update_moved((
VALUE *)key);
223 rb_gc_update_moved((
VALUE *)value);
231 if (!tbl || tbl->num_entries == 0)
return;
233 if (st_foreach_with_replace(tbl, hash_foreach_replace, hash_replace_ref, 0)) {
239xmalloc2_size(
const size_t count,
const size_t elsize)
241 return rb_size_mul_or_raise(count, elsize, rb_eArgError);
248#define COUNT_TYPE(t) case (t): return ID2SYM(rb_intern(#t)); break;
281#ifdef BUILDING_MODULAR_GC
unsigned int rb_postponed_job_handle_t
The type of a handle returned from rb_postponed_job_preregister and passed to rb_postponed_job_trigge...
uint32_t rb_event_flag_t
Represents event(s).
#define T_COMPLEX
Old name of RUBY_T_COMPLEX.
#define T_FILE
Old name of RUBY_T_FILE.
#define T_STRING
Old name of RUBY_T_STRING.
#define T_NIL
Old name of RUBY_T_NIL.
#define T_FLOAT
Old name of RUBY_T_FLOAT.
#define T_IMEMO
Old name of RUBY_T_IMEMO.
#define T_BIGNUM
Old name of RUBY_T_BIGNUM.
#define T_STRUCT
Old name of RUBY_T_STRUCT.
#define T_FIXNUM
Old name of RUBY_T_FIXNUM.
#define T_DATA
Old name of RUBY_T_DATA.
#define T_NONE
Old name of RUBY_T_NONE.
#define T_NODE
Old name of RUBY_T_NODE.
#define SIZET2NUM
Old name of RB_SIZE2NUM.
#define T_MODULE
Old name of RUBY_T_MODULE.
#define T_TRUE
Old name of RUBY_T_TRUE.
#define T_RATIONAL
Old name of RUBY_T_RATIONAL.
#define T_ICLASS
Old name of RUBY_T_ICLASS.
#define T_HASH
Old name of RUBY_T_HASH.
#define T_FALSE
Old name of RUBY_T_FALSE.
#define T_UNDEF
Old name of RUBY_T_UNDEF.
#define T_ZOMBIE
Old name of RUBY_T_ZOMBIE.
#define T_ARRAY
Old name of RUBY_T_ARRAY.
#define T_OBJECT
Old name of RUBY_T_OBJECT.
#define T_SYMBOL
Old name of RUBY_T_SYMBOL.
#define T_MATCH
Old name of RUBY_T_MATCH.
#define T_CLASS
Old name of RUBY_T_CLASS.
#define T_MOVED
Old name of RUBY_T_MOVED.
#define T_REGEXP
Old name of RUBY_T_REGEXP.
VALUE rb_eRuntimeError
RuntimeError exception.
VALUE type(ANYARGS)
ANYARGS-ed function type.
uintptr_t VALUE
Type that represents a Ruby object.
#define RBIMPL_WARNING_IGNORED(flag)
Suppresses a warning.
#define RBIMPL_WARNING_PUSH()
Pushes compiler warning state.
#define RBIMPL_WARNING_POP()
Pops compiler warning state.