From b746a0f0d273cb4b6f16ffad86ca7ea64d002ad2 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 29 Nov 2017 20:24:03 +0900 Subject: Need to free contexts when freeing fibers. Memory leak fixed; ref #3711 --- src/gc.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/gc.c b/src/gc.c index d5a55bde0..62161b7f0 100644 --- a/src/gc.c +++ b/src/gc.c @@ -780,17 +780,19 @@ obj_free(mrb_state *mrb, struct RBasic *obj, int end) { struct mrb_context *c = ((struct RFiber*)obj)->cxt; - if (!end && c && c != mrb->root_c) { + if (c && c != mrb->root_c) { mrb_callinfo *ci = c->ci; mrb_callinfo *ce = c->cibase; - while (ce <= ci) { - struct REnv *e = ci->env; - if (e && !is_dead(&mrb->gc, e) && - e->tt == MRB_TT_ENV && MRB_ENV_STACK_SHARED_P(e)) { - mrb_env_unshare(mrb, e); + if (!end) { + while (ce <= ci) { + struct REnv *e = ci->env; + if (e && !is_dead(&mrb->gc, e) && + e->tt == MRB_TT_ENV && MRB_ENV_STACK_SHARED_P(e)) { + mrb_env_unshare(mrb, e); + } + ci--; } - ci--; } mrb_free_context(mrb, c); } -- cgit v1.2.3