diff --git a/src/http/ngx_http_mruby_async.c b/src/http/ngx_http_mruby_async.c index aca111ef..089b7997 100644 --- a/src/http/ngx_http_mruby_async.c +++ b/src/http/ngx_http_mruby_async.c @@ -54,6 +54,11 @@ mrb_value ngx_mrb_start_fiber(ngx_http_request_t *r, mrb_state *mrb, struct RPro ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0, "%s NOTICE %s:%d: preparing fiber got the raise, leave the fiber", MODULE_NAME, __func__, __LINE__); return mrb_false_value(); + } else { + // keeps the object from GC when can resume the fiber + // Don't forget to remove the object using + // mrb_gc_unregister, otherwise your object will leak + mrb_gc_register(mrb, *fiber_proc); } return ngx_mrb_run_fiber(mrb, fiber_proc, result); @@ -73,12 +78,14 @@ mrb_value ngx_mrb_run_fiber(mrb_state *mrb, mrb_value *fiber_proc, mrb_value *re if (mrb->exc) { ngx_log_error(NGX_LOG_NOTICE, r->connection->log, 0, "%s NOTICE %s:%d: fiber got the raise, leave the fiber", MODULE_NAME, __func__, __LINE__); + mrb_gc_unregister(mrb, *fiber_proc); return mrb_false_value(); } aliving = mrb_fiber_alive_p(mrb, *fiber_proc); if (!mrb_test(aliving) && result != NULL) { + mrb_gc_unregister(mrb, *fiber_proc); *result = handler_result; } @@ -198,11 +205,6 @@ static mrb_value ngx_mrb_async_sleep(mrb_state *mrb, mrb_value self) ctx = ngx_mrb_http_get_module_ctx(mrb, r); re->fiber = ctx->fiber_proc; - // keeps the object from GC when can resume the fiber - // Don't forget to remove the object using - // mrb_gc_unregister, otherwise your object will leak - mrb_gc_register(mrb, *re->fiber); - ev = (ngx_event_t *)p; ngx_memzero(ev, sizeof(ngx_event_t)); ev->handler = ngx_mrb_timer_handler;