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)