diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-30 17:39:59 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-30 17:39:59 +0000 |
commit | a113ab64b23c430a944e639d0535529707540790 (patch) | |
tree | f5193a29b147b9439b6fac86dcf666e0bec3b770 | |
parent | 279cd29b1b544cba09f5839d4abce81ab322d2c6 (diff) |
* thread.c (rb_threadptr_interrupt_mask, async_interrupt_timing_func):
merge into them into rb_thread_s_async_interrupt_timing.
* thread.c (rb_thread_s_async_interrupt_timing): ditto.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38082 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | thread.c | 76 |
2 files changed, 38 insertions, 44 deletions
@@ -1,3 +1,9 @@ +Sat Dec 1 02:33:20 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com> + + * thread.c (rb_threadptr_interrupt_mask, async_interrupt_timing_func): + merge into them into rb_thread_s_async_interrupt_timing. + * thread.c (rb_thread_s_async_interrupt_timing): ditto. + Sat Dec 1 02:11:47 2012 KOSAKI Motohiro <kosaki.motohiro@gmail.com> * thread.c (rb_threadptr_interrupt_mask): add argument check. @@ -1559,40 +1559,6 @@ async_interrupt_timing_arg_check_i(VALUE key, VALUE val) return ST_CONTINUE; } -static VALUE -rb_threadptr_interrupt_mask(rb_thread_t *th, VALUE mask, VALUE (*func)(rb_thread_t *th)) -{ - VALUE r = Qnil; - int state; - - rb_hash_foreach(mask, async_interrupt_timing_arg_check_i, 0); - rb_ary_push(th->async_errinfo_mask_stack, mask); - if (!rb_threadptr_async_errinfo_empty_p(th)) { - th->async_errinfo_queue_checked = 0; - RUBY_VM_SET_INTERRUPT(th); - } - - TH_PUSH_TAG(th); - if ((state = EXEC_TAG()) == 0) { - r = func(th); - } - TH_POP_TAG(); - - rb_ary_pop(th->async_errinfo_mask_stack); - if (!rb_threadptr_async_errinfo_empty_p(th)) { - th->async_errinfo_queue_checked = 0; - RUBY_VM_SET_INTERRUPT(th); - } - - if (state) { - JUMP_TAG(state); - } - - RUBY_VM_CHECK_INTS(th); - - return r; -} - /* * call-seq: * Thread.async_interrupt_timing(hash) { ... } -> result of the block @@ -1673,23 +1639,45 @@ rb_threadptr_interrupt_mask(rb_thread_t *th, VALUE mask, VALUE (*func)(rb_thread * } * */ - -static VALUE -async_interrupt_timing_func(rb_thread_t *th) -{ - return rb_yield(Qnil); -} - static VALUE rb_thread_s_async_interrupt_timing(VALUE self, VALUE mask_arg) { + VALUE mask; + rb_thread_t *th = GET_THREAD(); + VALUE r = Qnil; + int state; + if (!rb_block_given_p()) { rb_raise(rb_eArgError, "block is needed."); } - return rb_threadptr_interrupt_mask(GET_THREAD(), - rb_convert_type(mask_arg, T_HASH, "Hash", "to_hash"), - async_interrupt_timing_func); + mask = rb_convert_type(mask_arg, T_HASH, "Hash", "to_hash"); + rb_hash_foreach(mask, async_interrupt_timing_arg_check_i, 0); + rb_ary_push(th->async_errinfo_mask_stack, mask); + if (!rb_threadptr_async_errinfo_empty_p(th)) { + th->async_errinfo_queue_checked = 0; + RUBY_VM_SET_INTERRUPT(th); + } + + TH_PUSH_TAG(th); + if ((state = EXEC_TAG()) == 0) { + r = rb_yield(Qnil); + } + TH_POP_TAG(); + + rb_ary_pop(th->async_errinfo_mask_stack); + if (!rb_threadptr_async_errinfo_empty_p(th)) { + th->async_errinfo_queue_checked = 0; + RUBY_VM_SET_INTERRUPT(th); + } + + if (state) { + JUMP_TAG(state); + } + + RUBY_VM_CHECK_INTS(th); + + return r; } /* |