From 486a9711f73d0d1bc3196552bf63611b89e911df Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Sun, 24 Dec 2023 10:30:03 +0900 Subject: [PATCH] MN: access `timer_th.waiting` with lock `timer_th.waiting` should be protected by `timer_th.waiting_lock` --- thread_pthread_mn.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/thread_pthread_mn.c b/thread_pthread_mn.c index a9c8dae74db8f0..c8c7d9f17345da 100644 --- a/thread_pthread_mn.c +++ b/thread_pthread_mn.c @@ -660,10 +660,6 @@ timer_thread_register_waiting(rb_thread_t *th, int fd, enum thread_sched_waiting #if HAVE_SYS_EVENT_H struct kevent ke[2]; int num_events = 0; - - if (kqueue_already_registered(fd)) { - return false; - } #else uint32_t epoll_events = 0; #endif @@ -708,6 +704,11 @@ timer_thread_register_waiting(rb_thread_t *th, int fd, enum thread_sched_waiting { #if HAVE_SYS_EVENT_H if (num_events > 0) { + if (kqueue_already_registered(fd)) { + rb_native_mutex_unlock(&timer_th.waiting_lock); + return false; + } + if (kevent(timer_th.event_fd, ke, num_events, NULL, 0, NULL) == -1) { RUBY_DEBUG_LOG("failed (%d)", errno);