ext/gyro/thread.c in polyphony-0.33 vs ext/gyro/thread.c in polyphony-0.34

- old
+ new

@@ -105,10 +105,11 @@ VALUE Thread_schedule_fiber(VALUE self, VALUE fiber, VALUE value) { if (rb_fiber_alive_p(fiber) != Qtrue) { return self; } + FIBER_TRACE(3, SYM_fiber_schedule, fiber, value); // if fiber is already scheduled, just set the scheduled value, then return rb_ivar_set(fiber, ID_runnable_value, value); if (rb_ivar_get(fiber, ID_runnable) != Qnil) { return self; @@ -183,10 +184,12 @@ // return Qnil; // } int ref_count = Thread_fiber_ref_count(self); if (next_fiber != Qnil) { if (ref_count > 0) { + // this mechanism prevents event starvation in case the run queue never + // empties Gyro_Selector_run_no_wait(selector, current_fiber, RARRAY_LEN(queue)); } break; } if (ref_count == 0) { @@ -216,12 +219,13 @@ Thread_fiber_reset_ref_count(self); return self; } VALUE Thread_post_fork(VALUE self) { - ev_loop_fork(EV_DEFAULT); - Thread_setup_fiber_scheduling(self); + VALUE selector = rb_ivar_get(self, ID_ivar_event_selector); + Gyro_Selector_post_fork(selector); + return self; } VALUE Fiber_await() { VALUE thread = rb_thread_current(); @@ -256,9 +260,11 @@ rb_define_singleton_method(rb_cThread, "event_selector=", Thread_event_selector_set_proc, 1); rb_define_singleton_method(rb_cThread, "create_event_selector", Thread_create_event_selector, 1); rb_define_method(rb_cThread, "fiber_ref", Thread_ref, 0); rb_define_method(rb_cThread, "fiber_unref", Thread_unref, 0); + + rb_define_method(rb_cThread, "post_fork", Thread_post_fork, 0); rb_define_method(rb_cThread, "setup_fiber_scheduling", Thread_setup_fiber_scheduling, 0); rb_define_method(rb_cThread, "stop_event_selector", Thread_stop_event_selector, 0); rb_define_method(rb_cThread, "reset_fiber_scheduling", Thread_reset_fiber_scheduling, 0); rb_define_method(rb_cThread, "fiber_scheduling_stats", Thread_fiber_scheduling_stats, 0);