mirror of
https://github.com/ruby/ruby.git
synced 2026-01-26 04:07:58 +00:00
Fix kqueue timeout for 0-valued timespec (#15940)
Timeout with 0-valued timespec means try to get an event, but return immediately if there is none. Apparently timespec can have other members, so best to 0 it out in that case.
This commit is contained in:
parent
48848e8da4
commit
e7e9303236
Notes:
git
2026-01-23 16:55:13 +00:00
Merged-By: luke-gru <luke.gru@gmail.com>
@ -617,11 +617,17 @@ kqueue_wait(rb_vm_t *vm)
|
||||
struct timespec *timeout = NULL;
|
||||
int timeout_ms = timer_thread_set_timeout(vm);
|
||||
|
||||
if (timeout_ms >= 0) {
|
||||
if (timeout_ms > 0) {
|
||||
calculated_timeout.tv_sec = timeout_ms / 1000;
|
||||
calculated_timeout.tv_nsec = (timeout_ms % 1000) * 1000000;
|
||||
timeout = &calculated_timeout;
|
||||
}
|
||||
else if (timeout_ms == 0) {
|
||||
// Relying on the absence of other members of struct timespec is not strictly portable,
|
||||
// and kevent needs a 0-valued timespec to mean immediate timeout.
|
||||
memset(&calculated_timeout, 0, sizeof(struct timespec));
|
||||
timeout = &calculated_timeout;
|
||||
}
|
||||
|
||||
return kevent(timer_th.event_fd, NULL, 0, timer_th.finished_events, KQUEUE_EVENTS_MAX, timeout);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user