From 22271cc84969a85dbeb93beb3686bfe1cdfcaf3a Mon Sep 17 00:00:00 2001 From: Daniel Spiewak Date: Fri, 3 Jan 2025 09:17:43 -0600 Subject: [PATCH] Split `epoll_wait` into blocking and non-blocking variants --- .../cats/effect/unsafe/EpollSystem.scala | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/core/native/src/main/scala/cats/effect/unsafe/EpollSystem.scala b/core/native/src/main/scala/cats/effect/unsafe/EpollSystem.scala index fc8ce7880d..f35bf7a6c1 100644 --- a/core/native/src/main/scala/cats/effect/unsafe/EpollSystem.scala +++ b/core/native/src/main/scala/cats/effect/unsafe/EpollSystem.scala @@ -217,7 +217,11 @@ object EpollSystem extends PollingSystem { @tailrec def processEvents(timeout: Int): Unit = { - val triggeredEvents = epoll_wait(epfd, events, MaxEvents, timeout) + val triggeredEvents = + if (timeout >= 0) + awaiting.epoll_wait(epfd, events, MaxEvents, timeout) + else + immediate.epoll_wait(epfd, events, MaxEvents, timeout) if (triggeredEvents >= 0) { polled = true @@ -317,9 +321,18 @@ object EpollSystem extends PollingSystem { def epoll_ctl(epfd: Int, op: Int, fd: Int, event: Ptr[epoll_event]): Int = extern - @blocking // TODO: create non-@blocking version - def epoll_wait(epfd: Int, events: Ptr[epoll_event], maxevents: Int, timeout: Int): Int = - extern + @extern + object awaiting { + @blocking + def epoll_wait(epfd: Int, events: Ptr[epoll_event], maxevents: Int, timeout: Int): Int = + extern + } + + @extern + object immediate { + def epoll_wait(epfd: Int, events: Ptr[epoll_event], maxevents: Int, timeout: Int): Int = + extern + } } private object epollImplicits {