summaryrefslogtreecommitdiff
path: root/thread.c
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-30 17:39:59 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2012-11-30 17:39:59 +0000
commita113ab64b23c430a944e639d0535529707540790 (patch)
treef5193a29b147b9439b6fac86dcf666e0bec3b770 /thread.c
parent279cd29b1b544cba09f5839d4abce81ab322d2c6 (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
Diffstat (limited to 'thread.c')
-rw-r--r--thread.c76
1 files changed, 32 insertions, 44 deletions
diff --git a/thread.c b/thread.c
index d5ff1246b7..fa5b1598ab 100644
--- a/thread.c
+++ b/thread.c
@@ -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;
}
/*