diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-06 07:44:28 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-11-06 07:44:28 +0000 |
commit | 5dfdaa92994096ac7c6713ebd77413271ff4bc41 (patch) | |
tree | e8d9634d0184a97f1d342a65b20207b03d272b20 /vm_core.h | |
parent | 5845bd6a718573da5f0f7e53368d2a1dda52f420 (diff) | |
download | ruby-5dfdaa92994096ac7c6713ebd77413271ff4bc41.tar.gz |
move rb_thread_t::interrupt_flag and mask
to rb_execution_context_t.
* vm_core.h (rb_thread_t): move
`rb_thread_t::interrupt_flag` and
`rb_thread_t::interrupt_mask` to rb_execution_context_t.
RUBY_VM_CHECK_INTS() accepts `ec` instead of `th`.
* cont.c (rb_fiber_terminate): to propagate interrupt information,
add new parameter `need_interrupt`.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60672 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_core.h')
-rw-r--r-- | vm_core.h | 30 |
1 files changed, 17 insertions, 13 deletions
@@ -745,6 +745,10 @@ typedef struct rb_execution_context_struct { int safe_level; int raised_flag; + /* interrupt flags */ + rb_atomic_t interrupt_flag; + unsigned long interrupt_mask; + rb_fiber_t *fiber_ptr; struct rb_thread_struct *thread_ptr; @@ -825,8 +829,7 @@ typedef struct rb_thread_struct { VALUE pending_interrupt_mask_stack; int pending_interrupt_queue_checked; - rb_atomic_t interrupt_flag; - unsigned long interrupt_mask; + /* interrupt management */ rb_nativethread_lock_t interrupt_lock; struct rb_unblock_callback unblock; VALUE locking_mutex; @@ -1652,12 +1655,13 @@ enum { TRAP_INTERRUPT_MASK = 0x08 }; -#define RUBY_VM_SET_TIMER_INTERRUPT(th) ATOMIC_OR((th)->interrupt_flag, TIMER_INTERRUPT_MASK) -#define RUBY_VM_SET_INTERRUPT(th) ATOMIC_OR((th)->interrupt_flag, PENDING_INTERRUPT_MASK) -#define RUBY_VM_SET_POSTPONED_JOB_INTERRUPT(th) ATOMIC_OR((th)->interrupt_flag, POSTPONED_JOB_INTERRUPT_MASK) -#define RUBY_VM_SET_TRAP_INTERRUPT(th) ATOMIC_OR((th)->interrupt_flag, TRAP_INTERRUPT_MASK) -#define RUBY_VM_INTERRUPTED(th) ((th)->interrupt_flag & ~(th)->interrupt_mask & (PENDING_INTERRUPT_MASK|TRAP_INTERRUPT_MASK)) -#define RUBY_VM_INTERRUPTED_ANY(th) ((th)->interrupt_flag & ~(th)->interrupt_mask) +#define RUBY_VM_SET_TIMER_INTERRUPT(ec) ATOMIC_OR((ec)->interrupt_flag, TIMER_INTERRUPT_MASK) +#define RUBY_VM_SET_INTERRUPT(ec) ATOMIC_OR((ec)->interrupt_flag, PENDING_INTERRUPT_MASK) +#define RUBY_VM_SET_POSTPONED_JOB_INTERRUPT(ec) ATOMIC_OR((ec)->interrupt_flag, POSTPONED_JOB_INTERRUPT_MASK) +#define RUBY_VM_SET_TRAP_INTERRUPT(ec) ATOMIC_OR((ec)->interrupt_flag, TRAP_INTERRUPT_MASK) +#define RUBY_VM_INTERRUPTED(ec) ((ec)->interrupt_flag & ~(ec)->interrupt_mask & \ + (PENDING_INTERRUPT_MASK|TRAP_INTERRUPT_MASK)) +#define RUBY_VM_INTERRUPTED_ANY(ec) ((ec)->interrupt_flag & ~(ec)->interrupt_mask) VALUE rb_exc_set_backtrace(VALUE exc, VALUE bt); int rb_signal_buff_size(void); @@ -1676,13 +1680,13 @@ void rb_execution_context_mark(const rb_execution_context_t *ec); void rb_fiber_close(rb_fiber_t *fib); void Init_native_thread(rb_thread_t *th); -#define RUBY_VM_CHECK_INTS(th) ruby_vm_check_ints(th) +#define RUBY_VM_CHECK_INTS(ec) ruby_vm_check_ints(ec) static inline void -ruby_vm_check_ints(rb_thread_t *th) +ruby_vm_check_ints(rb_execution_context_t *ec) { - VM_ASSERT(th->ec == ruby_current_execution_context_ptr); - if (UNLIKELY(RUBY_VM_INTERRUPTED_ANY(th))) { - rb_threadptr_execute_interrupts(th, 0); + VM_ASSERT(ec == ruby_current_execution_context_ptr); + if (UNLIKELY(RUBY_VM_INTERRUPTED_ANY(ec))) { + rb_threadptr_execute_interrupts(rb_ec_thread_ptr(ec), 0); } } |