|
#define | RUBY_REF_EDGE(s, p) offsetof(s, p) |
|
#define | RUBY_REFS_LIST_PTR(l) (RUBY_DATA_FUNC)(uintptr_t)(l) |
|
#define | RUBY_REF_END SIZE_MAX |
|
#define | RUBY_REFERENCES(t) static const size_t t[] |
|
#define | RUBY_REFERENCES_START(t) RUBY_REFERENCES(t) = { |
|
#define | RUBY_REFERENCES_END RUBY_REF_END, }; |
|
#define | USE_RGENGC 1 |
|
#define | USE_RGENGC_LOGGING_WB_UNPROTECT 0 |
|
#define | RGENGC_WB_PROTECTED_ARRAY 1 |
| This is a compile-time flag to enable/disable write barrier for struct RArray.
|
|
#define | RGENGC_WB_PROTECTED_HASH 1 |
| This is a compile-time flag to enable/disable write barrier for struct RHash.
|
|
#define | RGENGC_WB_PROTECTED_STRUCT 1 |
| This is a compile-time flag to enable/disable write barrier for struct RStruct.
|
|
#define | RGENGC_WB_PROTECTED_STRING 1 |
| This is a compile-time flag to enable/disable write barrier for struct RString.
|
|
#define | RGENGC_WB_PROTECTED_OBJECT 1 |
| This is a compile-time flag to enable/disable write barrier for struct RObject.
|
|
#define | RGENGC_WB_PROTECTED_REGEXP 1 |
| This is a compile-time flag to enable/disable write barrier for struct RRegexp.
|
|
#define | RGENGC_WB_PROTECTED_MATCH 1 |
| This is a compile-time flag to enable/disable write barrier for struct RMatch.
|
|
#define | RGENGC_WB_PROTECTED_CLASS 1 |
| This is a compile-time flag to enable/disable write barrier for struct RClass.
|
|
#define | RGENGC_WB_PROTECTED_FLOAT 1 |
| This is a compile-time flag to enable/disable write barrier for struct RFloat.
|
|
#define | RGENGC_WB_PROTECTED_COMPLEX 1 |
| This is a compile-time flag to enable/disable write barrier for struct RComplex.
|
|
#define | RGENGC_WB_PROTECTED_RATIONAL 1 |
| This is a compile-time flag to enable/disable write barrier for struct RRational.
|
|
#define | RGENGC_WB_PROTECTED_BIGNUM 1 |
| This is a compile-time flag to enable/disable write barrier for struct RBignum.
|
|
#define | RGENGC_WB_PROTECTED_NODE_CREF 1 |
|
#define | RB_OBJ_WRITE(old, slot, young) RBIMPL_CAST(rb_obj_write((VALUE)(old), (VALUE *)(slot), (VALUE)(young), __FILE__, __LINE__)) |
| Declaration of a "back" pointer.
|
|
#define | RB_OBJ_WRITTEN(old, oldv, young) RBIMPL_CAST(rb_obj_written((VALUE)(old), (VALUE)(oldv), (VALUE)(young), __FILE__, __LINE__)) |
| Identical to RB_OBJ_WRITE(), except it doesn't write any values, but only a WB declaration.
|
|
#define | OBJ_PROMOTED_RAW RB_OBJ_PROMOTED_RAW |
| Old name of RB_OBJ_PROMOTED_RAW.
|
|
#define | OBJ_PROMOTED RB_OBJ_PROMOTED |
| Old name of RB_OBJ_PROMOTED.
|
|
#define | OBJ_WB_UNPROTECT RB_OBJ_WB_UNPROTECT |
| Old name of RB_OBJ_WB_UNPROTECT.
|
|
#define | RB_OBJ_WB_UNPROTECT(x) rb_obj_wb_unprotect(x, __FILE__, __LINE__) |
| Asserts that the passed object is not fenced by write barriers.
|
|
#define | RB_OBJ_WB_UNPROTECT_FOR(type, obj) (RGENGC_WB_PROTECTED_##type ? OBJ_WB_UNPROTECT(obj) : obj) |
| Identical to RB_OBJ_WB_UNPROTECT(), except it can also assert that the given object is of given type.
|
|
#define | RGENGC_LOGGING_WB_UNPROTECT rb_gc_unprotect_logging |
| This is an implementation detail of rb_obj_wb_unprotect().
|
|
|
void | rb_memerror (void) |
| Triggers out-of-memory error.
|
|
int | rb_during_gc (void) |
| Queries if the GC is busy.
|
|
void | rb_gc_mark_locations (const VALUE *start, const VALUE *end) |
| Marks objects between the two pointers.
|
|
void | rb_mark_tbl (struct st_table *tbl) |
| Identical to rb_mark_hash(), except it marks only values of the table and leave their associated keys unmarked.
|
|
void | rb_mark_tbl_no_pin (struct st_table *tbl) |
| Identical to rb_mark_tbl(), except it marks objects using rb_gc_mark_movable().
|
|
void | rb_mark_set (struct st_table *tbl) |
| Identical to rb_mark_hash(), except it marks only keys of the table and leave their associated values unmarked.
|
|
void | rb_mark_hash (struct st_table *tbl) |
| Marks keys and values associated inside of the given table.
|
|
void | rb_gc_update_tbl_refs (st_table *ptr) |
| Updates references inside of tables.
|
|
void | rb_gc_mark_maybe (VALUE obj) |
| Identical to rb_gc_mark(), except it allows the passed value be a non-object.
|
|
void | rb_gc_mark (VALUE obj) |
| Marks an object.
|
|
void | rb_gc_mark_movable (VALUE obj) |
| Maybe this is the only function provided for C extensions to control the pinning of objects, so let us describe it in detail.
|
|
VALUE | rb_gc_location (VALUE obj) |
| Finds a new "location" of an object.
|
|
void | rb_gc (void) |
| Triggers a GC process.
|
|
void | rb_gc_copy_finalizer (VALUE dst, VALUE src) |
| Copy&paste an object's finaliser to another.
|
|
VALUE | rb_gc_enable (void) |
| (Re-) enables GC.
|
|
VALUE | rb_gc_disable (void) |
| Disables GC.
|
|
VALUE | rb_gc_start (void) |
| Identical to rb_gc(), except the return value.
|
|
VALUE | rb_define_finalizer (VALUE obj, VALUE block) |
| Assigns a finaliser for an object.
|
|
VALUE | rb_undefine_finalizer (VALUE obj) |
| Modifies the object so that it has no finalisers at all.
|
|
size_t | rb_gc_count (void) |
| Identical to rb_gc_stat(), with "count" parameter.
|
|
size_t | rb_gc_stat (VALUE key_or_buf) |
| Obtains various GC related profiles.
|
|
VALUE | rb_gc_latest_gc_info (VALUE key_or_buf) |
| Obtains various info regarding the most recent GC run.
|
|
void | rb_gc_adjust_memory_usage (ssize_t diff) |
| Informs that there are external memory usages.
|
|
void | rb_gc_register_address (VALUE *valptr) |
| Inform the garbage collector that the global or static variable pointed by valptr stores a live Ruby object that should not be moved.
|
|
void | rb_global_variable (VALUE *) |
| An alias for rb_gc_register_address() .
|
|
void | rb_gc_unregister_address (VALUE *valptr) |
| Inform the garbage collector that a pointer previously passed to rb_gc_register_address() no longer points to a live Ruby object.
|
|
void | rb_gc_register_mark_object (VALUE object) |
| Inform the garbage collector that object is a live Ruby object that should not be moved.
|
|
void | rb_gc_writebarrier (VALUE old, VALUE young) |
| This is the implementation of RB_OBJ_WRITE().
|
|
void | rb_gc_writebarrier_unprotect (VALUE obj) |
| This is the implementation of RB_OBJ_WB_UNPROTECT().
|
|
static bool | RB_OBJ_PROMOTED_RAW (VALUE obj) |
| This is the implementation of RB_OBJ_PROMOTED().
|
|
static bool | RB_OBJ_PROMOTED (VALUE obj) |
| Tests if the object is "promoted" – that is, whether the object experienced one or more GC marks.
|
|
static VALUE | rb_obj_wb_unprotect (VALUE x, const char *filename, int line) |
| This is the implementation of RB_OBJ_WB_UNPROTECT().
|
|
static void | rb_gc_force_recycle (VALUE obj) |
|
Registering values to the GC.
- Author
- Ruby developers ruby-.nosp@m.core.nosp@m.@ruby.nosp@m.-lan.nosp@m.g.org
- Copyright
- This file is a part of the programming language Ruby. Permission is hereby granted, to either redistribute and/or modify this file, provided that the conditions mentioned in the file COPYING are met. Consult the file for details.
- Warning
- Symbols prefixed with either
RBIMPL
or rbimpl
are implementation details. Don't take them as canon. They could rapidly appear then vanish. The name (path) of this header file is also an implementation detail. Do not expect it to persist at the place it is now. Developers are free to move it anywhere anytime at will.
- Note
- To ruby-core: remember that this header can be possibly recursively included from extension libraries written in C++. Do not expect for instance
__VA_ARGS__
is always available. We assume C99 for ruby itself but we don't assume languages of extension libraries. They could be written in C++98.
Definition in file gc.h.
void rb_gc_adjust_memory_usage |
( |
ssize_t |
diff | ) |
|
Informs that there are external memory usages.
Our GC runs when we are running out of memory. The amount of memory, however, can increase/decrease behind-the-scene. For instance DLLs can allocate memories using mmap(2)
etc, which are opaque to us. Registering such external allocations using this function enables proper detection of how much memories an object used as a whole. That will trigger GCs more often than it would otherwise. You can also pass negative numbers here, to indicate that such external allocations are gone.
- Parameters
-
[in] | diff | Amount of memory increased(+)/decreased(-). |
Definition at line 4776 of file gc.c.
Obtains various info regarding the most recent GC run.
This includes for instance the reason of the GC. The parameter can be either a Symbol or a Hash. If a Hash is passed, it is filled with everything currently available. If a Symbol is passed just that portion is returned.
Possible variations of keys you can pass here change from version to version. You can get the list of known keys by passing an empty hash and let it be filled.
- Parameters
-
[in,out] | key_or_buf | A Symbol, or a Hash. |
- Exceptions
-
rb_eTypeError | Neither Symbol nor Hash. |
rb_eFrozenError | Frozen hash is passed. |
- Returns
- In case a Hash is passed it returns that hash. Otherwise the profile value associated with the given key is returned.
- Postcondition
- In case a Hash is passed it is filled with values.
Definition at line 3707 of file gc.c.
void rb_gc_mark_movable |
( |
VALUE |
obj | ) |
|
Maybe this is the only function provided for C extensions to control the pinning of objects, so let us describe it in detail.
These days Ruby's GC is copying. As far as an object's physical address is guaranteed unused, it can move around the object space. Our GC engine rearranges these objects after it reclaims unreachable objects from our object space, so that the space is compact (improves memory locality). This is called the "compaction" phase, and works well most of the time... as far as there are no C extensions. C extensions complicate the scenario because Ruby core cannot detect any use of the physical address of an object inside of C functions. In order to prevent memory corruptions, objects observable from C extensions are "pinned"; they stick to where they are born until they die, just in case any C extensions touch their raw pointers. This variant of scheme is called "Mostly-Copying" garbage collector. Authors of C extensions, however, can extremely carefully write them to become compaction-aware. To do so avoid referring to a Ruby object from inside of your struct in the first place. But if that is not possible, use this function from your rb_data_type_struct::dmark then. This way objects marked using it are considered movable. If you chose this way you have to manually fix up locations of such moved pointers using rb_gc_location().
- See also
- Bartlett, Joel F., "Compacting Garbage Collection with Ambiguous
Roots", ACM SIGPLAN Lisp Pointers Volume 1 Issue 6 pp. 3-12, April-May-June, 1988. https://doi.org/10.1145/1317224.1317225
- Parameters
-
[in] | obj | Object that is movable. |
- Postcondition
- Values stored in
tbl
are marked.
Definition at line 2223 of file gc.c.
void rb_gc_register_address |
( |
VALUE * |
valptr | ) |
|
Inform the garbage collector that the global or static variable pointed by valptr
stores a live Ruby object that should not be moved.
Note that extensions should use this API on global constants instead of assuming constants defined in Ruby are always alive. Ruby code can remove global constants.
Because this registration itself has a possibility to trigger a GC, this function must be called before any GC-able objects is assigned to the address pointed by valptr
.
Definition at line 2975 of file gc.c.
size_t rb_gc_stat |
( |
VALUE |
key_or_buf | ) |
|
Obtains various GC related profiles.
The parameter can be either a Symbol or a Hash. If a Hash is passed, it is filled with everything currently available. If a Symbol is passed just that portion is returned.
Possible variations of keys you can pass here change from version to version. You can get the list of known keys by passing an empty hash and let it be filled.
- Parameters
-
[in,out] | key_or_buf | A Symbol, or a Hash. |
- Exceptions
-
rb_eTypeError | Neither Symbol nor Hash. |
rb_eFrozenError | Frozen hash is passed. |
- Returns
- In case a Hash is passed it returns 0. Otherwise the profile value associated with the given key is returned.
- Postcondition
- In case a Hash is passed it is filled with values.
Definition at line 3744 of file gc.c.