Some cosmetic changes, and comments
This commit is contained in:
parent
2eb34a8129
commit
fb0ef44864
1 changed files with 198 additions and 210 deletions
|
|
@ -299,6 +299,10 @@ else:
|
|||
s.fds[f].ident = 0
|
||||
s.fds[f].flags = {}
|
||||
|
||||
template checkMaxFd(s, fd) =
|
||||
if fd.uint >= s.maxFD:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
when supportedPlatform:
|
||||
template blockSignals(newmask: var Sigset, oldmask: var Sigset) =
|
||||
when hasThreadSupport:
|
||||
|
|
@ -326,7 +330,9 @@ else:
|
|||
#
|
||||
when bsdPlatform:
|
||||
const
|
||||
# Maximum number of cached changes
|
||||
MAX_KQUEUE_CHANGE_EVENTS = 64
|
||||
# Maximum number of events that can be returned
|
||||
MAX_KQUEUE_RESULT_EVENTS = 64
|
||||
|
||||
type
|
||||
|
|
@ -401,7 +407,7 @@ else:
|
|||
proc registerHandle*[T](s: Selector[T], fd: SocketHandle,
|
||||
events: set[Event], data: T) =
|
||||
var fdi = int(fd)
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident == 0)
|
||||
setKey(s, fdi, fdi, {Event.flagHandle} + events, 0, data)
|
||||
if events != {}:
|
||||
|
|
@ -411,13 +417,11 @@ else:
|
|||
if Event.Write in events:
|
||||
modifyKQueue(s, fdi.uint, EVFILT_WRITE, EV_ADD, 0, 0, nil)
|
||||
inc(s.count)
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc updateHandle*[T](s: Selector[T], fd: SocketHandle,
|
||||
events: set[Event]) =
|
||||
var fdi = int(fd)
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident != 0)
|
||||
doAssert(Event.flagHandle in s.fds[fdi].flags)
|
||||
var ne = events + {Event.flagHandle}
|
||||
|
|
@ -436,8 +440,6 @@ else:
|
|||
modifyKQueue(s, fdi.uint, EVFILT_WRITE, EV_ADD, 0, 0, nil)
|
||||
inc(s.count)
|
||||
s.fds[fdi].flags = ne
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc registerTimer*[T](s: Selector[T], timeout: int, oneshot: bool,
|
||||
data: T): int {.discardable.} =
|
||||
|
|
@ -445,7 +447,7 @@ else:
|
|||
posix.IPPROTO_TCP).int
|
||||
if fdi == -1:
|
||||
raiseOsError(osLastError())
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident == 0)
|
||||
var mflags = if oneshot: {Event.flagTimer, Event.flagOneshot}
|
||||
else: {Event.flagTimer}
|
||||
|
|
@ -458,8 +460,6 @@ else:
|
|||
modifyKQueue(s, fdi.uint, EVFILT_TIMER, kflags, 0, cint(timeout), nil)
|
||||
inc(s.count)
|
||||
result = fdi
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc registerSignal*[T](s: Selector[T], signal: int,
|
||||
data: T): int {.discardable.} =
|
||||
|
|
@ -468,7 +468,7 @@ else:
|
|||
if fdi == -1:
|
||||
raiseOsError(osLastError())
|
||||
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident == 0)
|
||||
setKey(s, fdi, signal, {Event.flagSignal}, signal, data)
|
||||
# block signal `signal`
|
||||
|
|
@ -484,8 +484,6 @@ else:
|
|||
cast[pointer](fdi))
|
||||
inc(s.count)
|
||||
result = fdi
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc registerProcess*[T](s: Selector[T], pid: int,
|
||||
data: T): int {.discardable.} =
|
||||
|
|
@ -494,7 +492,7 @@ else:
|
|||
if fdi == -1:
|
||||
raiseOsError(osLastError())
|
||||
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident == 0)
|
||||
var kflags: cushort = EV_ONESHOT or EV_ADD
|
||||
setKey(s, fdi, pid, {Event.flagProcess, Event.flagOneshot}, pid, data)
|
||||
|
|
@ -502,8 +500,6 @@ else:
|
|||
cast[pointer](fdi))
|
||||
inc(s.count)
|
||||
result = fdi
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc unregister*[T](s: Selector[T], fd: int|SocketHandle|cint) =
|
||||
var fdi = int(fd)
|
||||
|
|
@ -592,7 +588,6 @@ else:
|
|||
|
||||
proc unregister*[T](s: Selector[T], ev: SelectEvent) =
|
||||
let fdi = ev.rfd.int
|
||||
if fdi.uint < s.maxFD:
|
||||
var flags = s.fds[fdi].flags
|
||||
if s.fds[fdi].ident != 0 and flags != {}:
|
||||
modifyKQueue(s, fdi.uint, EVFILT_READ, EV_DELETE, 0, 0, nil)
|
||||
|
|
@ -710,6 +705,7 @@ else:
|
|||
|
||||
elif defined(linux):
|
||||
const
|
||||
# Maximum number of events that can be returned
|
||||
MAX_EPOLL_RESULT_EVENTS = 64
|
||||
type
|
||||
SignalFdInfo* {.importc: "struct signalfd_siginfo",
|
||||
|
|
@ -772,7 +768,6 @@ else:
|
|||
proc eventfd(count: cuint, flags: cint): cint
|
||||
{.cdecl, importc: "eventfd", header: "<sys/eventfd.h>".}
|
||||
|
||||
|
||||
type
|
||||
SelectorImpl[T] = object
|
||||
epollFD : cint
|
||||
|
|
@ -807,7 +802,7 @@ else:
|
|||
proc registerHandle*[T](s: Selector[T], fd: SocketHandle,
|
||||
events: set[Event], data: T) =
|
||||
var fdi = int(fd)
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident == 0)
|
||||
setKey(s, fdi, fdi, events + {Event.flagHandle}, 0, data)
|
||||
if events != {}:
|
||||
|
|
@ -821,13 +816,11 @@ else:
|
|||
if epoll_ctl(s.epollFD, EPOLL_CTL_ADD, fdi.cint, addr epv) == -1:
|
||||
raiseOSError(osLastError())
|
||||
inc(s.count)
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc updateHandle*[T](s: Selector[T], fd: SocketHandle,
|
||||
events: set[Event]) =
|
||||
var fdi = int(fd)
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
var oe = s.fds[fdi].flags
|
||||
doAssert(s.fds[fdi].ident != 0)
|
||||
doAssert(Event.flagHandle in oe)
|
||||
|
|
@ -849,7 +842,7 @@ else:
|
|||
raiseOSError(osLastError())
|
||||
inc(s.count)
|
||||
else:
|
||||
if events != {}:
|
||||
if ne != {Event.flagHandle}:
|
||||
if epoll_ctl(s.epollFD, EPOLL_CTL_MOD, fdi.cint,
|
||||
addr epv) == -1:
|
||||
raiseOSError(osLastError())
|
||||
|
|
@ -859,8 +852,6 @@ else:
|
|||
raiseOSError(osLastError())
|
||||
dec(s.count)
|
||||
s.fds[fdi].flags = ne
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc unregister*[T](s: Selector[T], fd: int|SocketHandle|cint) =
|
||||
var epv: epoll_event
|
||||
|
|
@ -924,7 +915,7 @@ else:
|
|||
var fdi = timerfd_create(CLOCK_MONOTONIC, 0)
|
||||
if fdi == -1:
|
||||
raiseOSError(osLastError())
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident == 0)
|
||||
var flags = {Event.flagTimer}
|
||||
var epv: epoll_event
|
||||
|
|
@ -950,25 +941,26 @@ else:
|
|||
setKey(s, fdi, fdi, flags, 0, data)
|
||||
inc(s.count)
|
||||
result = fdi
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc registerSignal*[T](s: Selector[T], signal: int,
|
||||
data: T): int {.discardable.} =
|
||||
var
|
||||
nmask: Sigset
|
||||
omask: Sigset
|
||||
fdi: cint
|
||||
|
||||
discard sigemptyset(nmask)
|
||||
discard sigemptyset(omask)
|
||||
discard sigaddset(nmask, signal.cint)
|
||||
discard sigaddset(nmask, cint(signal))
|
||||
blockSignals(nmask, omask)
|
||||
fdi = signalfd(-1, nmask, 0)
|
||||
|
||||
var fdi = signalfd(-1, nmask, 0).int
|
||||
if fdi == -1:
|
||||
raiseOSError(osLastError())
|
||||
if fdi.uint < s.maxFD:
|
||||
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident == 0)
|
||||
setNonBlocking(fdi.cint)
|
||||
|
||||
var epv: epoll_event
|
||||
epv.data.u64 = fdi.uint
|
||||
epv.events = EPOLLIN or EPOLLRDHUP
|
||||
|
|
@ -977,25 +969,26 @@ else:
|
|||
setKey(s, fdi, signal, {Event.flagSignal}, signal, data)
|
||||
inc(s.count)
|
||||
result = fdi
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc registerProcess*[T](s: Selector, pid: int,
|
||||
data: T): int {.discardable.} =
|
||||
var
|
||||
nmask: Sigset
|
||||
omask: Sigset
|
||||
fd: int
|
||||
|
||||
discard sigemptyset(nmask)
|
||||
discard sigemptyset(omask)
|
||||
discard sigaddset(nmask, posix.SIGCHLD)
|
||||
blockSignals(nmask, omask)
|
||||
var fdi = signalfd(-1, nmask, 0)
|
||||
if fd == -1:
|
||||
|
||||
var fdi = signalfd(-1, nmask, 0).int
|
||||
if fdi == -1:
|
||||
raiseOSError(osLastError())
|
||||
if fdi.uint < s.maxFD:
|
||||
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident == 0)
|
||||
setNonBlocking(fdi.cint)
|
||||
|
||||
var epv: epoll_event
|
||||
epv.data.u64 = fdi.uint
|
||||
epv.events = EPOLLIN or EPOLLRDHUP
|
||||
|
|
@ -1004,8 +997,6 @@ else:
|
|||
setKey(s, fdi, pid, {Event.flagProcess}, pid, data)
|
||||
inc(s.count)
|
||||
result = fdi
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc flush*[T](s: Selector[T]) =
|
||||
discard
|
||||
|
|
@ -1502,6 +1493,7 @@ else:
|
|||
#
|
||||
|
||||
else:
|
||||
# Maximum number of events that can be returned
|
||||
const MAX_POLL_RESULT_EVENTS = 64
|
||||
|
||||
type
|
||||
|
|
@ -1600,17 +1592,15 @@ else:
|
|||
proc registerHandle*[T](s: Selector[T], fd: SocketHandle,
|
||||
events: set[Event], data: T) =
|
||||
var fdi = int(fd)
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
doAssert(s.fds[fdi].ident == 0)
|
||||
setKey(s, fdi, fdi, {Event.flagHandle} + events, 0, data)
|
||||
s.pollAdd(fdi.cint, events)
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc updateHandle*[T](s: Selector[T], fd: SocketHandle,
|
||||
events: set[Event]) =
|
||||
var fdi = int(fd)
|
||||
if fdi.uint < s.maxFD:
|
||||
s.checkMaxFd(fdi)
|
||||
var oe = s.fds[fdi].flags
|
||||
doAssert(s.fds[fdi].ident != 0)
|
||||
doAssert(Event.flagHandle in oe)
|
||||
|
|
@ -1621,8 +1611,6 @@ else:
|
|||
else:
|
||||
s.pollRemove(fd.cint)
|
||||
s.fds[fdi].flags = ne
|
||||
else:
|
||||
raise newException(ValueError, "Maximum file descriptors exceeded")
|
||||
|
||||
proc registerTimer*[T](s: Selector[T], timeout: int, oneshot: bool,
|
||||
data: T): int {.discardable.} =
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue