summaryrefslogtreecommitdiff
path: root/cont.c
diff options
context:
space:
mode:
authorAaron Patterson <tenderlove@ruby-lang.org>2019-05-31 13:25:24 -0700
committerAaron Patterson <tenderlove@ruby-lang.org>2019-06-11 09:16:14 -0700
commit6db2d6d8520f88e25d97af77495eb6c879f90b21 (patch)
tree25c42ae8e1a14a019a37401d65ad32f10aa506c6 /cont.c
parentc4cbaef216ffcc9bda70cc328a805ad679ccaa8c (diff)
Add compaction support for more types.
This commit adds compaction support for: * Fibers * Continuations * Autoload Constants
Diffstat (limited to 'cont.c')
-rw-r--r--cont.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/cont.c b/cont.c
index 516a847b9e..0d091b9169 100644
--- a/cont.c
+++ b/cont.c
@@ -340,12 +340,21 @@ cont_thread_value(const rb_context_t *cont)
}
static void
+cont_compact(void *ptr)
+{
+ rb_context_t *cont = ptr;
+
+ cont->value = rb_gc_location(cont->value);
+ rb_execution_context_update(&cont->saved_ec);
+}
+
+static void
cont_mark(void *ptr)
{
rb_context_t *cont = ptr;
RUBY_MARK_ENTER("cont");
- rb_gc_mark(cont->value);
+ rb_gc_mark_no_pin(cont->value);
rb_execution_context_mark(&cont->saved_ec);
rb_gc_mark(cont_thread_value(cont));
@@ -481,10 +490,21 @@ cont_memsize(const void *ptr)
}
void
+rb_fiber_update_self(rb_fiber_t *fib)
+{
+ if (fib->cont.self) {
+ fib->cont.self = rb_gc_location(fib->cont.self);
+ }
+ else {
+ rb_execution_context_update(&fib->cont.saved_ec);
+ }
+}
+
+void
rb_fiber_mark_self(const rb_fiber_t *fib)
{
if (fib->cont.self) {
- rb_gc_mark(fib->cont.self);
+ rb_gc_mark_no_pin(fib->cont.self);
}
else {
rb_execution_context_mark(&fib->cont.saved_ec);
@@ -492,12 +512,24 @@ rb_fiber_mark_self(const rb_fiber_t *fib)
}
static void
+fiber_compact(void *ptr)
+{
+ rb_fiber_t *fib = ptr;
+ fib->first_proc = rb_gc_location(fib->first_proc);
+
+ if (fib->prev) rb_fiber_update_self(fib->prev);
+
+ cont_compact(&fib->cont);
+ fiber_verify(fib);
+}
+
+static void
fiber_mark(void *ptr)
{
rb_fiber_t *fib = ptr;
RUBY_MARK_ENTER("cont");
fiber_verify(fib);
- rb_gc_mark(fib->first_proc);
+ rb_gc_mark_no_pin(fib->first_proc);
if (fib->prev) rb_fiber_mark_self(fib->prev);
#if !FIBER_USE_NATIVE
@@ -602,7 +634,7 @@ cont_save_machine_stack(rb_thread_t *th, rb_context_t *cont)
static const rb_data_type_t cont_data_type = {
"continuation",
- {cont_mark, cont_free, cont_memsize,},
+ {cont_mark, cont_free, cont_memsize, cont_compact},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
};
@@ -1424,7 +1456,7 @@ rb_cont_call(int argc, VALUE *argv, VALUE contval)
static const rb_data_type_t fiber_data_type = {
"fiber",
- {fiber_mark, fiber_free, fiber_memsize,},
+ {fiber_mark, fiber_free, fiber_memsize, fiber_compact,},
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
};