mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* cont.c (cont_new): add debug message.
* cont.c (cont_restore_1): copy stack information from fiber. * cont.c (rb_fiber_s_new): fix to mark created fiber. * test/ruby/test_fiber.rb: add some tests around Thread and Fiber. * yarvcore.c (thread_free): fix to skip freeing stack if root fiber is available. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12454 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
ed88975237
commit
d80e7373cf
4 changed files with 48 additions and 3 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
|||
Thu Jun 7 03:17:24 2007 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* cont.c (cont_new): add debug message.
|
||||
|
||||
* cont.c (cont_restore_1): copy stack information from fiber.
|
||||
|
||||
* cont.c (rb_fiber_s_new): fix to mark created fiber.
|
||||
|
||||
* test/ruby/test_fiber.rb: add some tests around Thread and Fiber.
|
||||
|
||||
* yarvcore.c (thread_free): fix to skip freeing stack if root fiber
|
||||
is available.
|
||||
|
||||
Thu Jun 7 01:03:20 2007 Koichi Sasada <ko1@atdot.net>
|
||||
|
||||
* eval_intern.h, eval.c (ruby_init): remove POP_TAG_INIT().
|
||||
|
|
16
cont.c
16
cont.c
|
@ -111,6 +111,10 @@ cont_new(VALUE klass)
|
|||
|
||||
contval = Data_Make_Struct(klass, rb_context_t,
|
||||
cont_mark, cont_free, cont);
|
||||
|
||||
GC_INFO("cont alloc: %p (klass: %s)\n", cont,
|
||||
klass == rb_cFiber ? "Fiber": "Continuation");
|
||||
|
||||
cont->self = contval;
|
||||
cont->alive = Qtrue;
|
||||
|
||||
|
@ -169,8 +173,15 @@ cont_restore_1(rb_context_t *cont)
|
|||
}
|
||||
else {
|
||||
/* continuation */
|
||||
MEMCPY(th->stack, cont->vm_stack, VALUE, sth->stack_size);
|
||||
th->fiber = sth->fiber;
|
||||
|
||||
if (th->fiber) {
|
||||
rb_context_t *fcont;
|
||||
GetContPtr(th->fiber, fcont);
|
||||
th->stack_size = fcont->saved_thread.stack_size;
|
||||
th->stack = fcont->saved_thread.stack;
|
||||
}
|
||||
MEMCPY(th->stack, cont->vm_stack, VALUE, sth->stack_size);
|
||||
}
|
||||
|
||||
th->cfp = sth->cfp;
|
||||
|
@ -369,6 +380,7 @@ static VALUE
|
|||
rb_fiber_s_new(VALUE self)
|
||||
{
|
||||
rb_context_t *cont = cont_new(self);
|
||||
VALUE contval = cont->self;
|
||||
rb_thread_t *th = &cont->saved_thread;
|
||||
|
||||
/* initialize */
|
||||
|
@ -396,7 +408,7 @@ rb_fiber_s_new(VALUE self)
|
|||
|
||||
MEMCPY(&cont->jmpbuf, &th->root_jmpbuf, rb_jmpbuf_t, 1);
|
||||
|
||||
return cont->self;
|
||||
return contval;
|
||||
}
|
||||
|
||||
static VALUE rb_fiber_yield(int argc, VALUE *args, VALUE fval);
|
||||
|
|
|
@ -40,6 +40,23 @@ class TestFiber < Test::Unit::TestCase
|
|||
)
|
||||
end
|
||||
|
||||
def test_many_fibers_with_threads
|
||||
max = 1000
|
||||
@cnt = 0
|
||||
(1..100).map{|ti|
|
||||
Thread.new{
|
||||
max.times{|i|
|
||||
Fiber.new{
|
||||
@cnt += 1
|
||||
}.yield
|
||||
}
|
||||
}
|
||||
}.each{|t|
|
||||
t.join
|
||||
}
|
||||
assert_equal(:ok, :ok)
|
||||
end
|
||||
|
||||
def test_error
|
||||
assert_raise(ArgumentError){
|
||||
Fiber.new # Fiber without block
|
||||
|
|
|
@ -226,7 +226,10 @@ thread_free(void *ptr)
|
|||
|
||||
if (ptr) {
|
||||
th = ptr;
|
||||
FREE_UNLESS_NULL(th->stack);
|
||||
|
||||
if (!th->root_fiber) {
|
||||
FREE_UNLESS_NULL(th->stack);
|
||||
}
|
||||
|
||||
if (th->local_storage) {
|
||||
st_free_table(th->local_storage);
|
||||
|
|
Loading…
Reference in a new issue