From adc1419499d6e02438374e820321b3fbe293fb56 Mon Sep 17 00:00:00 2001 From: Ray Imber Date: Sun, 6 Oct 2019 16:02:12 -0700 Subject: [PATCH] Test + fix for epoll and kqueue selector modules to properly unregister event handles that have the key type "User" --- lib/pure/ioselects/ioselectors_epoll.nim | 2 +- lib/pure/ioselects/ioselectors_kqueue.nim | 4 ++-- tests/async/testmanyasyncevents.nim | 23 +++++++++++++++++++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 tests/async/testmanyasyncevents.nim diff --git a/lib/pure/ioselects/ioselectors_epoll.nim b/lib/pure/ioselects/ioselectors_epoll.nim index 7c6f151648..da7ef8a9ac 100644 --- a/lib/pure/ioselects/ioselectors_epoll.nim +++ b/lib/pure/ioselects/ioselectors_epoll.nim @@ -197,7 +197,7 @@ proc unregister*[T](s: Selector[T], fd: int|SocketHandle) = "Descriptor $# is not registered in the selector!" % $fdi) if pkey.events != {}: when not defined(android): - if pkey.events * {Event.Read, Event.Write} != {}: + if pkey.events * {Event.Read, Event.Write, Event.User} != {}: var epv = EpollEvent() # TODO: Refactor all these EPOLL_CTL_DEL + dec(s.count) into a proc. if epoll_ctl(s.epollFD, EPOLL_CTL_DEL, fdi.cint, addr epv) != 0: diff --git a/lib/pure/ioselects/ioselectors_kqueue.nim b/lib/pure/ioselects/ioselectors_kqueue.nim index 0c51e67f49..9e1d1a800c 100644 --- a/lib/pure/ioselects/ioselectors_kqueue.nim +++ b/lib/pure/ioselects/ioselectors_kqueue.nim @@ -375,7 +375,7 @@ proc unregister*[T](s: Selector[T], fd: int|SocketHandle) = "Descriptor [" & $fdi & "] is not registered in the queue!") if pkey.events != {}: - if pkey.events * {Event.Read, Event.Write} != {}: + if pkey.events * {Event.Read, Event.Write, Event.User} != {}: if Event.Read in pkey.events: modifyKQueue(s, uint(fdi), EVFILT_READ, EV_DELETE, 0, 0, nil) dec(s.count) @@ -632,4 +632,4 @@ template withData*[T](s: Selector[T], fd: SocketHandle|int, value, body1, proc getFd*[T](s: Selector[T]): int = - return s.kqFD.int \ No newline at end of file + return s.kqFD.int diff --git a/tests/async/testmanyasyncevents.nim b/tests/async/testmanyasyncevents.nim new file mode 100644 index 0000000000..5453810134 --- /dev/null +++ b/tests/async/testmanyasyncevents.nim @@ -0,0 +1,23 @@ +discard """ +output: ''' +hasPendingOperations: false +triggerCount: 512 +''' +""" + +import asyncDispatch + +var triggerCount = 0 +var evs = newSeq[AsyncEvent]() + +for i in 0 ..< 512: # has to be lower than the typical physical fd limit + var ev = newAsyncEvent() + evs.add(ev) + addEvent(ev, proc(fd: AsyncFD): bool {.gcsafe,closure.} = triggerCount += 1; true) + +for ev in evs: + ev.trigger() + +drain() +echo "hasPendingOperations: ", hasPendingOperations() +echo "triggerCount: ", triggerCount