Ruby  3.4.0dev (2024-12-06 revision 892c46283a5ea4179500d951c9d4866c0051f27b)
gc.h
Go to the documentation of this file.
1 #ifndef RBIMPL_GC_H /*-*-C++-*-vi:se ft=cpp:*/
2 #define RBIMPL_GC_H
23 #include "ruby/internal/config.h"
24 
25 #ifdef STDC_HEADERS
26 # include <stddef.h> /* size_t */
27 #endif
28 
29 #ifdef HAVE_SYS_TYPES_H
30 # include <sys/types.h> /* ssize_t */
31 #endif
32 
33 #include "ruby/assert.h"
42 #include "ruby/internal/stdbool.h"
43 #include "ruby/internal/value.h"
44 
46 
47 #define RUBY_REF_EDGE(s, p) offsetof(s, p)
48 #define RUBY_REFS_LIST_PTR(l) (RUBY_DATA_FUNC)(uintptr_t)(l)
49 #define RUBY_REF_END SIZE_MAX
50 #define RUBY_REFERENCES(t) static const size_t t[]
51 #define RUBY_REFERENCES_START(t) RUBY_REFERENCES(t) = {
52 #define RUBY_REFERENCES_END RUBY_REF_END, };
53 
54 /* gc.c */
55 
65 void rb_memerror(void);
66 
74 int rb_during_gc(void);
75 
92 void rb_gc_mark_locations(const VALUE *start, const VALUE *end);
93 
104 void rb_mark_tbl(struct st_table *tbl);
105 
115 void rb_mark_tbl_no_pin(struct st_table *tbl);
116 
127 void rb_mark_set(struct st_table *tbl);
128 
137 void rb_mark_hash(struct st_table *tbl);
138 
149 
160 void rb_gc_mark_maybe(VALUE obj);
161 
169 void rb_gc_mark(VALUE obj);
170 
199 void rb_gc_mark_movable(VALUE obj);
200 
211 
237 void rb_gc(void);
238 
253 void rb_gc_copy_finalizer(VALUE dst, VALUE src);
254 
267 VALUE rb_gc_enable(void);
268 
284 VALUE rb_gc_disable(void);
285 
291 VALUE rb_gc_start(void);
292 
314 
327 
333 size_t rb_gc_count(void);
334 
351 size_t rb_gc_stat(VALUE key_or_buf);
352 
370 VALUE rb_gc_latest_gc_info(VALUE key_or_buf);
371 
384 void rb_gc_adjust_memory_usage(ssize_t diff);
385 
397 void rb_gc_register_address(VALUE *valptr);
398 
402 void rb_global_variable(VALUE *);
403 
408 void rb_gc_unregister_address(VALUE *valptr);
409 
416 void rb_gc_register_mark_object(VALUE object);
417 
419 
427 #undef USE_RGENGC
428 #define USE_RGENGC 1
429 
434 #ifndef USE_RGENGC_LOGGING_WB_UNPROTECT
435 # define USE_RGENGC_LOGGING_WB_UNPROTECT 0
436 #endif
437 
445 #ifndef RGENGC_WB_PROTECTED_ARRAY
446 # define RGENGC_WB_PROTECTED_ARRAY 1
447 #endif
448 
456 #ifndef RGENGC_WB_PROTECTED_HASH
457 # define RGENGC_WB_PROTECTED_HASH 1
458 #endif
459 
467 #ifndef RGENGC_WB_PROTECTED_STRUCT
468 # define RGENGC_WB_PROTECTED_STRUCT 1
469 #endif
470 
478 #ifndef RGENGC_WB_PROTECTED_STRING
479 # define RGENGC_WB_PROTECTED_STRING 1
480 #endif
481 
489 #ifndef RGENGC_WB_PROTECTED_OBJECT
490 # define RGENGC_WB_PROTECTED_OBJECT 1
491 #endif
492 
500 #ifndef RGENGC_WB_PROTECTED_REGEXP
501 # define RGENGC_WB_PROTECTED_REGEXP 1
502 #endif
503 
511 #ifndef RGENGC_WB_PROTECTED_MATCH
512 # define RGENGC_WB_PROTECTED_MATCH 1
513 #endif
514 
522 #ifndef RGENGC_WB_PROTECTED_CLASS
523 # define RGENGC_WB_PROTECTED_CLASS 1
524 #endif
525 
533 #ifndef RGENGC_WB_PROTECTED_FLOAT
534 # define RGENGC_WB_PROTECTED_FLOAT 1
535 #endif
536 
544 #ifndef RGENGC_WB_PROTECTED_COMPLEX
545 # define RGENGC_WB_PROTECTED_COMPLEX 1
546 #endif
547 
555 #ifndef RGENGC_WB_PROTECTED_RATIONAL
556 # define RGENGC_WB_PROTECTED_RATIONAL 1
557 #endif
558 
566 #ifndef RGENGC_WB_PROTECTED_BIGNUM
567 # define RGENGC_WB_PROTECTED_BIGNUM 1
568 #endif
569 
581 #ifndef RGENGC_WB_PROTECTED_NODE_CREF
582 # define RGENGC_WB_PROTECTED_NODE_CREF 1
583 #endif
584 
603 #define RB_OBJ_WRITE(old, slot, young) \
604  RBIMPL_CAST(rb_obj_write((VALUE)(old), (VALUE *)(slot), (VALUE)(young), __FILE__, __LINE__))
605 
615 #define RB_OBJ_WRITTEN(old, oldv, young) \
616  RBIMPL_CAST(rb_obj_written((VALUE)(old), (VALUE)(oldv), (VALUE)(young), __FILE__, __LINE__))
619 #define OBJ_PROMOTED_RAW RB_OBJ_PROMOTED_RAW
620 #define OBJ_PROMOTED RB_OBJ_PROMOTED
621 #define OBJ_WB_UNPROTECT RB_OBJ_WB_UNPROTECT
630 #define RB_OBJ_WB_UNPROTECT(x) rb_obj_wb_unprotect(x, __FILE__, __LINE__)
631 
643 #define RB_OBJ_WB_UNPROTECT_FOR(type, obj) \
644  (RGENGC_WB_PROTECTED_##type ? OBJ_WB_UNPROTECT(obj) : obj)
645 
652 #define RGENGC_LOGGING_WB_UNPROTECT rb_gc_unprotect_logging
653 
655 #define RB_OBJ_PROMOTED_RAW RB_OBJ_PROMOTED_RAW
656 #define RB_OBJ_PROMOTED RB_OBJ_PROMOTED
667 void rb_gc_writebarrier(VALUE old, VALUE young);
668 
676 
677 #if USE_RGENGC_LOGGING_WB_UNPROTECT
690 void rb_gc_unprotect_logging(void *objptr, const char *filename, int line);
691 #endif
692 
694 
705 static inline bool
707 {
709  return RB_FL_ANY_RAW(obj, RUBY_FL_PROMOTED);
710 }
711 
725 static inline bool
727 {
728  if (! RB_FL_ABLE(obj)) {
729  return false;
730  }
731  else {
732  return RB_OBJ_PROMOTED_RAW(obj);
733  }
734 }
735 
745 static inline VALUE
747  VALUE x,
749  const char *filename,
751  int line)
752 {
753 #if USE_RGENGC_LOGGING_WB_UNPROTECT
754  RGENGC_LOGGING_WB_UNPROTECT(RBIMPL_CAST((void *)x), filename, line);
755 #endif
757  return x;
758 }
759 
773 static inline VALUE
774 rb_obj_written(
775  VALUE a,
777  VALUE oldv,
778  VALUE b,
780  const char *filename,
782  int line)
783 {
784 #if USE_RGENGC_LOGGING_WB_UNPROTECT
785  RGENGC_LOGGING_OBJ_WRITTEN(a, oldv, b, filename, line);
786 #endif
787 
788  if (!RB_SPECIAL_CONST_P(b)) {
789  rb_gc_writebarrier(a, b);
790  }
791 
792  return a;
793 }
794 
808 static inline VALUE
809 rb_obj_write(
810  VALUE a, VALUE *slot, VALUE b,
812  const char *filename,
814  int line)
815 {
816 #ifdef RGENGC_LOGGING_WRITE
817  RGENGC_LOGGING_WRITE(a, slot, b, filename, line);
818 #endif
819 
820  *slot = b;
821 
822  rb_obj_written(a, RUBY_Qundef /* ignore `oldv' now */, b, filename, line);
823  return a;
824 }
825 
826 RBIMPL_ATTR_DEPRECATED(("Will be removed soon"))
827 static inline void rb_gc_force_recycle(VALUE obj){}
828 
829 #endif /* RBIMPL_GC_H */
Defines RBIMPL_ATTR_ARTIFICIAL.
#define RBIMPL_ATTR_ARTIFICIAL()
Wraps (or simulates) __attribute__((artificial))
Definition: artificial.h:41
#define RBIMPL_ASSERT_OR_ASSUME(...)
This is either RUBY_ASSERT or RBIMPL_ASSUME, depending on RUBY_DEBUG.
Definition: assert.h:311
Defines RBIMPL_ATTR_COLD.
#define RBIMPL_ATTR_COLD()
Wraps (or simulates) __attribute__((cold))
Definition: cold.h:32
#define RBIMPL_ATTR_DEPRECATED(msg)
Wraps (or simulates) [[deprecated]]
Definition: deprecated.h:36
Tweaking visibility of C variables/functions.
#define RBIMPL_SYMBOL_EXPORT_END()
Counterpart of RBIMPL_SYMBOL_EXPORT_BEGIN.
Definition: dllexport.h:74
#define RBIMPL_SYMBOL_EXPORT_BEGIN()
Shortcut macro equivalent to RUBY_SYMBOL_EXPORT_BEGIN extern "C" {.
Definition: dllexport.h:65
static bool RB_FL_ABLE(VALUE obj)
Checks if the object is flaggable.
Definition: fl_type.h:444
static bool RB_FL_ANY_RAW(VALUE obj, VALUE flags)
This is an implementation detail of RB_FL_ANY().
Definition: fl_type.h:518
@ RUBY_FL_PROMOTED
Ruby objects are "generational".
Definition: fl_type.h:218
void rb_gc_mark(VALUE obj)
Marks an object.
Definition: gc.c:2211
void rb_mark_tbl_no_pin(struct st_table *tbl)
Identical to rb_mark_tbl(), except it marks objects using rb_gc_mark_movable().
Definition: gc.c:2517
void rb_memerror(void)
Triggers out-of-memory error.
Definition: gc.c:4426
size_t rb_gc_stat(VALUE key_or_buf)
Obtains various GC related profiles.
Definition: gc.c:3703
void rb_gc_mark_movable(VALUE obj)
Maybe this is the only function provided for C extensions to control the pinning of objects,...
Definition: gc.c:2193
VALUE rb_gc_disable(void)
Disables GC.
Definition: gc.c:3837
VALUE rb_gc_start(void)
Identical to rb_gc(), except the return value.
Definition: gc.c:3631
static VALUE rb_obj_wb_unprotect(VALUE x, const char *filename, int line)
This is the implementation of RB_OBJ_WB_UNPROTECT().
Definition: gc.h:746
VALUE rb_gc_latest_gc_info(VALUE key_or_buf)
Obtains various info regarding the most recent GC run.
Definition: gc.c:3666
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...
Definition: gc.c:2501
VALUE rb_gc_enable(void)
(Re-) enables GC.
Definition: gc.c:3803
void rb_mark_hash(struct st_table *tbl)
Marks keys and values associated inside of the given table.
Definition: gc.c:2355
VALUE rb_undefine_finalizer(VALUE obj)
Modifies the object so that it has no finalisers at all.
int rb_during_gc(void)
Queries if the GC is busy.
Definition: gc.c:3646
void rb_gc_register_address(VALUE *valptr)
Inform the garbage collector that the global or static variable pointed by valptr stores a live Ruby ...
Definition: gc.c:2927
void rb_gc_unregister_address(VALUE *valptr)
Inform the garbage collector that a pointer previously passed to rb_gc_register_address() no longer p...
Definition: gc.c:2951
void rb_gc_mark_maybe(VALUE obj)
Identical to rb_gc_mark(), except it allows the passed value be a non-object.
Definition: gc.c:2223
void rb_gc_writebarrier(VALUE old, VALUE young)
This is the implementation of RB_OBJ_WRITE().
Definition: gc.c:2846
VALUE rb_gc_location(VALUE obj)
Finds a new "location" of an object.
Definition: gc.c:3136
void rb_gc_writebarrier_unprotect(VALUE obj)
This is the implementation of RB_OBJ_WB_UNPROTECT().
Definition: gc.c:2852
void rb_gc_mark_locations(const VALUE *start, const VALUE *end)
Marks objects between the two pointers.
Definition: gc.c:2277
void rb_gc(void)
Triggers a GC process.
Definition: gc.c:3638
void rb_gc_register_mark_object(VALUE object)
Inform the garbage collector that object is a live Ruby object that should not be moved.
Definition: gc.c:2918
void rb_gc_update_tbl_refs(st_table *ptr)
Updates references inside of tables.
Definition: gc.c:3098
#define RGENGC_LOGGING_WB_UNPROTECT
This is an implementation detail of rb_obj_wb_unprotect().
Definition: gc.h:652
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...
Definition: gc.c:2307
VALUE rb_define_finalizer(VALUE obj, VALUE block)
Assigns a finaliser for an object.
Definition: gc.c:1688
void rb_gc_copy_finalizer(VALUE dst, VALUE src)
Copy&paste an object's finaliser to another.
Definition: gc.c:1603
static bool RB_OBJ_PROMOTED(VALUE obj)
Tests if the object is "promoted" – that is, whether the object experienced one or more GC marks.
Definition: gc.h:726
static bool RB_OBJ_PROMOTED_RAW(VALUE obj)
This is the implementation of RB_OBJ_PROMOTED().
Definition: gc.h:706
void rb_gc_adjust_memory_usage(ssize_t diff)
Informs that there are external memory usages.
Definition: gc.c:4698
size_t rb_gc_count(void)
Identical to rb_gc_stat(), with "count" parameter.
Definition: gc.c:3654
RBIMPL_ATTR_NORETURN() void rb_eof_error(void)
Utility function to raise rb_eEOFError.
char * ptr
Pointer to the underlying memory region, of at least capa bytes.
Definition: io.h:2
RBIMPL_ATTR_PURE() int rb_io_read_pending(rb_io_t *fptr)
Queries if the passed IO has any pending reads.
Defines RBIMPL_ATTR_MAYBE_UNUSED.
#define RBIMPL_ATTR_MAYBE_UNUSED()
Wraps (or simulates) [[maybe_unused]]
Definition: maybe_unused.h:33
Defines RBIMPL_ATTR_NONNULL.
#define RBIMPL_ATTR_NONNULL(list)
Wraps (or simulates) __attribute__((nonnull))
Definition: nonnull.h:27
Defines RBIMPL_ATTR_NORETURN.
#define inline
Old Visual Studio versions do not support the inline keyword, so we need to define it to be __inline.
Definition: defines.h:88
Defines RBIMPL_ATTR_PURE.
#define RBIMPL_ATTR_PURE_UNLESS_DEBUG()
Enables RBIMPL_ATTR_PURE if and only if.
Definition: pure.h:38
Defines enum ruby_special_consts.
static bool RB_SPECIAL_CONST_P(VALUE obj)
Checks if the given object is of enum ruby_special_consts.
@ RUBY_Qundef
Represents so-called undef.
C99 shim for <stdbool.h>
Definition: st.h:79
Defines VALUE and ID.
uintptr_t VALUE
Type that represents a Ruby object.
Definition: value.h:40