Feature #9894
closed
[RFC] README.EXT: document rb_gc_register_mark_object
Added by normalperson (Eric Wong) over 10 years ago.
Updated almost 6 years ago.
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
- Status changed from Open to Closed
(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
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 support rb_global_variable()
. So I
want to make it obsolete.
This is why I introduce rb_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.
- Has duplicate Feature #9893: [RFC] README.EXT: document rb_gc_register_mark_object added
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
(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
- Status changed from Closed to Open
- Description updated (diff)
- Status changed from Open to Closed
Applied in changeset trunk|r66534.
Mention rb_gc_register_mark_object [ci skip]
[Feature #9894]
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0