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);