summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-05-22 11:05:22 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-05-22 11:05:22 +0900
commit2045a3529266e903d0db0c9e16081fe2fa01b9df (patch)
tree33458e1f6953cf6851db4bcff85d4d899f04058e
parent1cfd3fb9eb7d53b7f91126169ae48b7c64a8cd3e (diff)
downloadmruby-2045a3529266e903d0db0c9e16081fe2fa01b9df.tar.gz
mruby-2045a3529266e903d0db0c9e16081fe2fa01b9df.zip
garbage collect context (fiber) properly
-rw-r--r--include/mruby.h2
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c4
-rw-r--r--src/gc.c5
3 files changed, 8 insertions, 3 deletions
diff --git a/include/mruby.h b/include/mruby.h
index 73c38cf1d..925344502 100644
--- a/include/mruby.h
+++ b/include/mruby.h
@@ -74,6 +74,8 @@ struct mrb_context {
int rsize;
struct RProc **ensure;
int esize;
+
+ struct RFiber *fib;
};
enum gc_state {
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index e46e3cb02..c338b8b95 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -80,9 +80,9 @@ fiber_init(mrb_state *mrb, mrb_value self)
f->cxt = (struct mrb_context*)mrb_malloc(mrb, sizeof(struct mrb_context));
*f->cxt = mrb_context_zero;
+ c = f->cxt;
/* initialize VM stack */
- c = f->cxt;
c->stbase = (mrb_value *)mrb_calloc(mrb, FIBER_STACK_INIT_SIZE, sizeof(mrb_value));
c->stend = c->stbase + FIBER_STACK_INIT_SIZE;
c->stack = c->stbase;
@@ -104,6 +104,8 @@ fiber_init(mrb_state *mrb, mrb_value self)
ci[1] = ci[0];
c->ci++; /* push dummy callinfo */
+ c->fib = f;
+
return self;
}
diff --git a/src/gc.c b/src/gc.c
index 4837d5207..4d0ba8a16 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -412,7 +412,9 @@ mark_context(mrb_state *mrb, struct mrb_context *c)
mrb_gc_mark(mrb, (struct RBasic*)ci->proc);
mrb_gc_mark(mrb, (struct RBasic*)ci->target_class);
}
- if (c->prev) mark_context(mrb, c->prev);
+ if (c->prev && c->prev->fib) {
+ mrb_gc_mark(mrb, (struct RBasic*)c->prev->fib);
+ }
}
static void
@@ -472,7 +474,6 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
struct mrb_context *c = ((struct RFiber*)obj)->cxt;
mark_context(mrb, c);
- ((struct RFiber*)obj)->cxt = NULL;
}
break;