aboutsummaryrefslogtreecommitdiffstats
path: root/vm_core.h
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-11-06 07:44:28 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-11-06 07:44:28 +0000
commit1096d702ed9e4cbc26499fe3749acc7f3609da8f (patch)
treee8d9634d0184a97f1d342a65b20207b03d272b20 /vm_core.h
parentf0f7f42e8810fe80056df83771004c52fea28b08 (diff)
downloadruby-1096d702ed9e4cbc26499fe3749acc7f3609da8f.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.h30
1 files changed, 17 insertions, 13 deletions
diff --git a/vm_core.h b/vm_core.h
index 8bbf95f4cd..41b91aff5a 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -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);
}
}