* cont.c (cont_new, cont_capture, fiber_t_alloc): needs already

running thread.  cf. [ruby-core:25681]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25014 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2009-09-21 01:13:24 +00:00
parent cd4f59bc5e
commit 3a7c1e25c4
2 changed files with 18 additions and 6 deletions

View File

@ -1,3 +1,8 @@
Mon Sep 21 10:13:22 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* cont.c (cont_new, cont_capture, fiber_t_alloc): needs already
running thread. cf. [ruby-core:25681]
Mon Sep 21 00:07:36 2009 Nobuyoshi Nakada <nobu@ruby-lang.org> Mon Sep 21 00:07:36 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/bigdecimal/lib/bigdecimal/math.rb (sin, cos, atan, exp, log): * ext/bigdecimal/lib/bigdecimal/math.rb (sin, cos, atan, exp, log):

19
cont.c
View File

@ -74,6 +74,9 @@ static VALUE rb_eFiberError;
NOINLINE(static VALUE cont_capture(volatile int *stat)); NOINLINE(static VALUE cont_capture(volatile int *stat));
void rb_thread_mark(rb_thread_t *th); void rb_thread_mark(rb_thread_t *th);
#define THREAD_MUST_BE_RUNNING(th) do { \
if (!th->tag) rb_raise(rb_eThreadError, "not running thread"); \
} while (0)
static void static void
cont_mark(void *ptr) cont_mark(void *ptr)
@ -276,10 +279,8 @@ static const rb_data_type_t cont_data_type = {
}; };
static void static void
cont_init(rb_context_t *cont) cont_init(rb_context_t *cont, rb_thread_t *th)
{ {
rb_thread_t *th = GET_THREAD();
/* save thread context */ /* save thread context */
cont->saved_thread = *th; cont->saved_thread = *th;
} }
@ -289,10 +290,12 @@ cont_new(VALUE klass)
{ {
rb_context_t *cont; rb_context_t *cont;
volatile VALUE contval; volatile VALUE contval;
rb_thread_t *th = GET_THREAD();
THREAD_MUST_BE_RUNNING(th);
contval = TypedData_Make_Struct(klass, rb_context_t, &cont_data_type, cont); contval = TypedData_Make_Struct(klass, rb_context_t, &cont_data_type, cont);
cont->self = contval; cont->self = contval;
cont_init(cont); cont_init(cont, th);
return cont; return cont;
} }
@ -305,6 +308,7 @@ cont_capture(volatile int *stat)
rb_thread_t *th = GET_THREAD(), *sth; rb_thread_t *th = GET_THREAD(), *sth;
volatile VALUE contval; volatile VALUE contval;
THREAD_MUST_BE_RUNNING(th);
rb_vm_stack_to_heap(th); rb_vm_stack_to_heap(th);
cont = cont_new(rb_cContinuation); cont = cont_new(rb_cContinuation);
contval = cont->self; contval = cont->self;
@ -716,12 +720,15 @@ fiber_alloc(VALUE klass)
static rb_fiber_t* static rb_fiber_t*
fiber_t_alloc(VALUE fibval) fiber_t_alloc(VALUE fibval)
{ {
rb_fiber_t *fib = ALLOC(rb_fiber_t); rb_fiber_t *fib;
rb_thread_t *th = GET_THREAD();
THREAD_MUST_BE_RUNNING(th);
fib = ALLOC(rb_fiber_t);
memset(fib, 0, sizeof(rb_fiber_t)); memset(fib, 0, sizeof(rb_fiber_t));
fib->cont.self = fibval; fib->cont.self = fibval;
fib->cont.type = FIBER_CONTEXT; fib->cont.type = FIBER_CONTEXT;
cont_init(&fib->cont); cont_init(&fib->cont, th);
fib->prev = Qnil; fib->prev = Qnil;
fib->status = CREATED; fib->status = CREATED;