[Bug #19584] [DOC] Tweek description of rb_gc_register_address

This commit is contained in:
Nobuyoshi Nakada 2023-04-07 12:25:20 +09:00
parent f99af43980
commit 4adcfc8cd7
No known key found for this signature in database
GPG Key ID: 7CD2805BFA3770C6
2 changed files with 18 additions and 7 deletions

12
gc.c
View File

@ -9209,10 +9209,16 @@ rb_gc_register_address(VALUE *addr)
tmp->varptr = addr;
global_list = tmp;
/* obj has to be guarded here because the allocation above could trigger a
* GC. However, C extensions could pass a pointer to a global variable
* which does not exist on the stack and thus could get swept. */
/*
* Because some C extensions have assignment-then-register bugs,
* we guard `obj` here so that it would not get swept defensively.
*/
RB_GC_GUARD(obj);
if (0 && !SPECIAL_CONST_P(obj)) {
rb_warn("Object is assigned to registering address already: %"PRIsVALUE,
rb_obj_class(obj));
rb_print_backtrace();
}
}
void

View File

@ -399,10 +399,15 @@ VALUE rb_gc_latest_gc_info(VALUE key_or_buf);
void rb_gc_adjust_memory_usage(ssize_t diff);
/**
* Inform the garbage collector that `valptr` points to 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.
* 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`.
*/
void rb_gc_register_address(VALUE *valptr);