aboutsummaryrefslogtreecommitdiffstats
path: root/thread_pthread.c
diff options
context:
space:
mode:
Diffstat (limited to 'thread_pthread.c')
-rw-r--r--thread_pthread.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/thread_pthread.c b/thread_pthread.c
index 71667aec69..97879f559a 100644
--- a/thread_pthread.c
+++ b/thread_pthread.c
@@ -194,6 +194,7 @@ designate_timer_thread(rb_global_vm_lock_t *gvl)
static void
do_gvl_timer(rb_global_vm_lock_t *gvl, rb_thread_t *th)
{
+ rb_vm_t *vm = GET_VM();
static rb_hrtime_t abs;
native_thread_data_t *nd = &th->native_thread_data;
@@ -208,14 +209,14 @@ do_gvl_timer(rb_global_vm_lock_t *gvl, rb_thread_t *th)
gvl->timer_err = native_cond_timedwait(&nd->cond.gvlq, &gvl->lock, &abs);
ubf_wakeup_all_threads();
- ruby_sigchld_handler(GET_VM());
+ ruby_sigchld_handler(vm);
if (UNLIKELY(rb_signal_buff_size())) {
- if (th == GET_VM()->ractor.main_thread) {
+ if (th == vm->ractor.main_thread) {
RUBY_VM_SET_TRAP_INTERRUPT(th->ec);
}
else {
- threadptr_trap_interrupt(GET_VM()->ractor.main_thread);
+ threadptr_trap_interrupt(vm->ractor.main_thread);
}
}
@@ -223,7 +224,10 @@ do_gvl_timer(rb_global_vm_lock_t *gvl, rb_thread_t *th)
* Timeslice. Warning: the process may fork while this
* thread is contending for GVL:
*/
- if (gvl->owner) timer_thread_function(gvl->owner->ec);
+ if (gvl->owner) {
+ // strictly speaking, accessing "gvl->owner" is not thread-safe
+ RUBY_VM_SET_TIMER_INTERRUPT(gvl->owner->ec);
+ }
gvl->timer = 0;
}