ext/rev/rev_loop.c in rev-0.1.3 vs ext/rev/rev_loop.c in rev-0.1.4

- old
+ new

@@ -54,10 +54,11 @@ { struct Rev_Loop *loop = (struct Rev_Loop *)xmalloc(sizeof(struct Rev_Loop)); loop->ev_loop = 0; + loop->running = 0; loop->events_received = 0; loop->eventbuf_size = DEFAULT_EVENTBUF_SIZE; loop->eventbuf = (struct Rev_Event *)xmalloc(sizeof(struct Rev_Event) * DEFAULT_EVENTBUF_SIZE); return Data_Wrap_Struct(klass, Rev_Loop_mark, Rev_Loop_free, loop); @@ -175,14 +176,20 @@ static VALUE Rev_Loop_run_once(VALUE self) { struct Rev_Loop *loop_data; Data_Get_Struct(self, struct Rev_Loop, loop_data); + if(loop_data->running) + rb_raise(rb_eRuntimeError, "cannot run loop from within a callback"); + assert(loop_data->ev_loop && !loop_data->events_received); + + loop_data->running = 1; rb_thread_blocking_region(Rev_Loop_run_once_blocking, loop_data->ev_loop, RB_UBF_DFL, 0); Rev_Loop_dispatch_events(loop_data); loop_data->events_received = 0; + loop_data->running = 0; return Qnil; } static VALUE Rev_Loop_run_once_blocking(void *ptr) @@ -203,13 +210,19 @@ static VALUE Rev_Loop_run_nonblock(VALUE self) { struct Rev_Loop *loop_data; Data_Get_Struct(self, struct Rev_Loop, loop_data); + if(loop_data->running) + rb_raise(rb_eRuntimeError, "cannot run loop from within a callback"); + assert(loop_data->ev_loop && !loop_data->events_received); + + loop_data->running = 1; ev_loop(loop_data->ev_loop, EVLOOP_NONBLOCK); Rev_Loop_dispatch_events(loop_data); loop_data->events_received = 0; + loop_data->running = 0; return Qnil; } static void Rev_Loop_dispatch_events(struct Rev_Loop *loop_data)