MN: access `timer_th.waiting` with lock

`timer_th.waiting` should be protected by `timer_th.waiting_lock`
This commit is contained in:
Koichi Sasada 2023-12-24 10:30:03 +09:00
Родитель daefbf8fbf
Коммит 82015496b9
1 изменённых файлов: 5 добавлений и 4 удалений

Просмотреть файл

@ -660,10 +660,6 @@ timer_thread_register_waiting(rb_thread_t *th, int fd, enum thread_sched_waiting
#if HAVE_SYS_EVENT_H #if HAVE_SYS_EVENT_H
struct kevent ke[2]; struct kevent ke[2];
int num_events = 0; int num_events = 0;
if (kqueue_already_registered(fd)) {
return false;
}
#else #else
uint32_t epoll_events = 0; uint32_t epoll_events = 0;
#endif #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 HAVE_SYS_EVENT_H
if (num_events > 0) { 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) { if (kevent(timer_th.event_fd, ke, num_events, NULL, 0, NULL) == -1) {
RUBY_DEBUG_LOG("failed (%d)", errno); RUBY_DEBUG_LOG("failed (%d)", errno);