-
Notifications
You must be signed in to change notification settings - Fork 781
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow recycling fibers by GC if not referenced directly #6253
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -190,10 +190,12 @@ mrb_realloc_simple(mrb_state *mrb, void *p, size_t len) | |
void *p2; | ||
|
||
#if defined(MRB_GC_STRESS) && defined(MRB_DEBUG) | ||
mrb_full_gc(mrb); | ||
if (mrb->gc.state != MRB_GC_STATE_SWEEP) { | ||
mrb_full_gc(mrb); | ||
} | ||
#endif | ||
p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud); | ||
if (!p2 && len > 0 && mrb->gc.heaps) { | ||
if (!p2 && len > 0 && mrb->gc.heaps && mrb->gc.state != MRB_GC_STATE_SWEEP) { | ||
mrb_full_gc(mrb); | ||
p2 = (mrb->allocf)(mrb, p, len, mrb->allocf_ud); | ||
} | ||
|
@@ -628,9 +630,8 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) | |
{ | ||
struct REnv *e = (struct REnv*)obj; | ||
|
||
if (MRB_ENV_ONSTACK_P(e) && e->cxt && e->cxt->fib) { | ||
mrb_gc_mark(mrb, (struct RBasic*)e->cxt->fib); | ||
} | ||
// The data stack must always be protected from GC regardless of the MRB_ENV_CLOSE flag. | ||
// This is because the data stack is not protected if the fiber is GC'd. | ||
mrb_int len = MRB_ENV_LEN(e); | ||
for (mrb_int i=0; i<len; i++) { | ||
mrb_gc_mark_value(mrb, e->stack[i]); | ||
|
@@ -771,7 +772,20 @@ obj_free(mrb_state *mrb, struct RBasic *obj, mrb_bool end) | |
{ | ||
struct mrb_context *c = ((struct RFiber*)obj)->cxt; | ||
|
||
if (c != mrb->root_c) { | ||
if (c && c != mrb->root_c) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for your review. I checked and it seems that omitting the % lldb18 -- bin/mruby -e 'Fiber.allocate; GC.start'
(lldb) target create "bin/mruby"
Current executable set to '/var/tmp/mruby/bin/mruby' (x86_64).
(lldb) settings set -- target.run-args "-e" "Fiber.allocate; GC.start"
(lldb) r
Process 90188 launched: '/var/tmp/mruby/bin/mruby' (x86_64)
Process 90188 stopped
* thread #1, name = 'mruby', stop reason = signal SIGSEGV: address not mapped to object (fault address: 0x30)
frame #0: 0x0000000000413264 mruby`obj_free(mrb=0x000008d4df809000, obj=0x000008d4df82ad70, end=false) at gc.c:776:24
773 struct mrb_context *c = ((struct RFiber*)obj)->cxt;
774
775 if (c != mrb->root_c) {
-> 776 if (!end && c->status != MRB_FIBER_TERMINATED) {
777 mrb_callinfo *ci = c->ci;
778 mrb_callinfo *ce = c->cibase;
779
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Well, thank you for the confirmation. My bad. |
||
if (!end && c->status != MRB_FIBER_TERMINATED) { | ||
mrb_callinfo *ci = c->ci; | ||
mrb_callinfo *ce = c->cibase; | ||
|
||
while (ce <= ci) { | ||
struct REnv *e = ci->u.env; | ||
if (e && !is_dead(&mrb->gc, (struct RBasic*)e) && | ||
e->tt == MRB_TT_ENV && MRB_ENV_ONSTACK_P(e)) { | ||
mrb_env_unshare(mrb, e, TRUE); | ||
} | ||
ci--; | ||
} | ||
} | ||
mrb_free_context(mrb, c); | ||
} | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was checking again and found a period when this section did not exist.
% git log -L627,640:src/gc.c 22518b5b789293e7ddad7a94def44039937d8e8c
There is no mention of a commit message, but it corresponds to a revert of commit b6598e0.