Feature #9894
closed[RFC] README.EXT: document rb_gc_register_mark_object
Description
Any comment on officially supporting this as part of the C API?
diff --git a/README.EXT b/README.EXT
index d66d6c5..dded850 100644
--- a/README.EXT
+++ b/README.EXT
@@ -1176,6 +1176,12 @@ void rb_global_variable(VALUE *var)
Tells GC to protect these variables.
+void rb_gc_register_mark_object(VALUE val)
+
+ Tells GC to protect the object referenced by val. This requires less
+ memory to track than rb_global_variable, but may only be used if the C
+ variable never changes.
+
== Constant Definition
void rb_define_const(VALUE klass, const char *name, VALUE val) ::
--
Eric Wong
Updated by hsbt (Hiroshi SHIBATA) over 10 years ago
- Status changed from Open to Closed
duprecated #9893
Updated by ko1 (Koichi Sasada) over 10 years ago
(2014/05/31 4:56), Eric Wong wrote:
+void rb_gc_register_mark_object(VALUE val) + + Tells GC to protect the object referenced by val. This requires less + memory to track than rb_global_variable, but may only be used if the C + variable never changes. +
How about that?
Tells GC to protect the object referenced by val.
Another things are implementation details.
And I'm not sure the following sentence is needed.
but may only be used if the C
variable never changes.
I think it may assume global variables. But this API is independent from
C's global variables. I think this comment may be for
rb_global_variable
users, but it is different API.
PS.
For our MVM development, we can not support rb_global_variable()
. So I
want to make it obsolete.
This is why I introduce rb_gc_register_mark_object()
. But not yet.
--
// SASADA Koichi at atdot dot net
Updated by normalperson (Eric Wong) over 10 years ago
SASADA Koichi ko1@atdot.net wrote:
(2014/05/31 4:56), Eric Wong wrote:
+void rb_gc_register_mark_object(VALUE val) + + Tells GC to protect the object referenced by val. This requires less + memory to track than rb_global_variable, but may only be used if the C + variable never changes. +
How about that?
Tells GC to protect the object referenced by val.
Another things are implementation details.
And I'm not sure the following sentence is needed.
but may only be used if the C
variable never changes.I think it may assume global variables. But this API is independent from
C's global variables. I think this comment may be for
rb_global_variable
users, but it is different API.
I think it is important to tell users how it is different from
rb_global_variable
and when it is OK or not OK to use. So I think
the implementation details/difference from rb_global_variable is
important to prevent misuse.
May we consider this part of the supported C API?
PS.
For our MVM development, we can not supportrb_global_variable()
. So I
want to make it obsolete.
This is why I introducerb_gc_register_mark_object()
. But not yet.
Is MVM still happening? I haven't heard about it in a long time.
If so, we should move fstring and symbol table into the vm struct.
Updated by nagachika (Tomoyuki Chikanaga) over 10 years ago
- Has duplicate Feature #9893: [RFC] README.EXT: document rb_gc_register_mark_object added
Updated by normalperson (Eric Wong) over 10 years ago
I tried making rb_gc_register_address work transparently but wasn't able
to measure any difference with unicorn. unicorn uses a few global
const strings for common HTTP headers, but maybe not enough to matter
for this patch.
This patch is probably pointless, but in case somebody else wants to try
and show it makes a difference, it is here:
--- a/gc.c
+++ b/gc.c
@@ -5154,13 +5154,15 @@ rb_gc_register_mark_object(VALUE obj)
void
rb_gc_register_address(VALUE *addr)
{
- rb_objspace_t *objspace = &rb_objspace;
- struct gc_list *tmp;
-
- tmp = ALLOC(struct gc_list);
- tmp->next = global_list;
- tmp->varptr = addr;
- global_list = tmp;
+ if (OBJ_FROZEN(*addr)) {
+ rb_gc_register_mark_object(*addr);
+ } else {
+ rb_objspace_t *objspace = &rb_objspace;
+ struct gc_list *tmp = ALLOC(struct gc_list);
+ tmp->next = global_list;
+ tmp->varptr = addr;
+ global_list = tmp;
+ }
}
void
Updated by ko1 (Koichi Sasada) over 10 years ago
(2014/08/04 7:48), Eric Wong wrote:
--- a/gc.c +++ b/gc.c @@ -5154,13 +5154,15 @@ rb_gc_register_mark_object(VALUE obj) void rb_gc_register_address(VALUE *addr) { - rb_objspace_t *objspace = &rb_objspace; - struct gc_list *tmp; - - tmp = ALLOC(struct gc_list); - tmp->next = global_list; - tmp->varptr = addr; - global_list = tmp; + if (OBJ_FROZEN(*addr)) { + rb_gc_register_mark_object(*addr); + } else { + rb_objspace_t *objspace = &rb_objspace; + struct gc_list *tmp = ALLOC(struct gc_list); + tmp->next = global_list; + tmp->varptr = addr; + global_list = tmp; + } } void
This patch does not work. You should not use
rb_gc_register_mark_object()
because *addr
is mutable.
--
// SASADA Koichi at atdot dot net
Updated by naruse (Yui NARUSE) about 6 years ago
- Status changed from Closed to Open
Updated by nobu (Nobuyoshi Nakada) almost 6 years ago
- Status changed from Open to Closed