From 2045a3529266e903d0db0c9e16081fe2fa01b9df Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 22 May 2013 11:05:22 +0900 Subject: garbage collect context (fiber) properly --- include/mruby.h | 2 ++ mrbgems/mruby-fiber/src/fiber.c | 4 +++- src/gc.c | 5 +++-- 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; -- cgit v1.2.3