summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-11-29 20:24:03 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-11-29 20:24:03 +0900
commitb746a0f0d273cb4b6f16ffad86ca7ea64d002ad2 (patch)
tree6ac22521f5422d33666b205f87239094e5d35cfc /src
parent9c78a9bfa2665c1801bea0298cf5c6b930faea1c (diff)
downloadmruby-b746a0f0d273cb4b6f16ffad86ca7ea64d002ad2.tar.gz
mruby-b746a0f0d273cb4b6f16ffad86ca7ea64d002ad2.zip
Need to free contexts when freeing fibers.
Memory leak fixed; ref #3711
Diffstat (limited to 'src')
-rw-r--r--src/gc.c16
1 files 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);
}