* Fix #5128, #5184.
Removed flush() procedure from ioselectors.nim
Changed methods of work with application-driven data

* Make cache switch for kqueue, update test for it.

* Fix registerProcess bug returns wrong id.
Fix tupcoming_async test to compile with upcoming again.
Change socket() as unique identifier to dup(socket) as unique identifier.
This commit is contained in:
Eugene Kabanov 2017-01-16 15:01:40 +02:00 • committed by Andreas Rumpf
commit 108f5e688e
8 changed files with 674 additions and 479 deletions

View file

@ -37,9 +37,6 @@ when not defined(windows):
var client_socket = create_test_socket()
var server_socket = create_test_socket()
registerHandle(selector, server_socket, {Event.Read}, 0)
registerHandle(selector, client_socket, {Event.Write}, 0)
var option : int32 = 1
if setsockopt(server_socket, cint(SOL_SOCKET), cint(SO_REUSEADDR),
addr(option), sizeof(option).SockLen) < 0:
@ -50,16 +47,19 @@ when not defined(windows):
aiList.ai_addrlen.Socklen) < 0'i32:
dealloc(aiList)
raiseOSError(osLastError())
discard server_socket.listen()
if server_socket.listen() == -1:
raiseOSError(osLastError())
dealloc(aiList)
aiList = getAddrInfo("127.0.0.1", Port(13337))
discard posix.connect(client_socket, aiList.ai_addr,
aiList.ai_addrlen.Socklen)
registerHandle(selector, server_socket, {Event.Read}, 0)
registerHandle(selector, client_socket, {Event.Write}, 0)
dealloc(aiList)
discard selector.select(100)
var rc1 = selector.select(100)
assert(len(rc1) == 2)
var sockAddress: SockAddr
var addrLen = sizeof(sockAddress).Socklen
@ -126,15 +126,15 @@ when not defined(windows):
var selector = newSelector[int]()
var event = newSelectEvent()
selector.registerEvent(event, 1)
selector.flush()
var rc0 = selector.select(0)
event.setEvent()
var rc1 = selector.select(0)
event.setEvent()
var rc2 = selector.select(0)
var rc3 = selector.select(0)
assert(len(rc1) == 1 and len(rc2) == 1 and len(rc3) == 0)
var ev1 = rc1[0].data
var ev2 = rc2[0].data
assert(len(rc0) == 0 and len(rc1) == 1 and len(rc2) == 1 and len(rc3) == 0)
var ev1 = selector.getData(rc1[0].fd)
var ev2 = selector.getData(rc2[0].fd)
assert(ev1 == 1 and ev2 == 1)
selector.unregister(event)
event.close()
@ -150,11 +150,11 @@ when not defined(windows):
var rc2 = selector.select(140)
assert(len(rc1) == 1 and len(rc2) == 1)
selector.unregister(timer)
selector.flush()
discard selector.select(0)
selector.registerTimer(100, true, 0)
var rc3 = selector.select(120)
var rc4 = selector.select(120)
assert(len(rc3) == 1 and len(rc4) == 0)
var rc5 = selector.select(120)
assert(len(rc4) == 1 and len(rc5) == 0)
assert(selector.isEmpty())
selector.close()
result = true
@ -193,12 +193,14 @@ when not defined(windows):
var s1 = selector.registerSignal(SIGUSR1, 1)
var s2 = selector.registerSignal(SIGUSR2, 2)
var s3 = selector.registerSignal(SIGTERM, 3)
selector.flush()
discard selector.select(0)
discard posix.kill(pid, SIGUSR1)
discard posix.kill(pid, SIGUSR2)
discard posix.kill(pid, SIGTERM)
var rc = selector.select(0)
var cd0 = selector.getData(rc[0].fd)
var cd1 = selector.getData(rc[1].fd)
var cd2 = selector.getData(rc[2].fd)
selector.unregister(s1)
selector.unregister(s2)
selector.unregister(s3)
@ -211,7 +213,7 @@ when not defined(windows):
raiseOSError(osLastError())
assert(len(rc) == 3)
assert(rc[0].data + rc[1].data + rc[2].data == 6) # 1 + 2 + 3
assert(cd0 + cd1 + cd2 == 6, $(cd0 + cd1 + cd2)) # 1 + 2 + 3
assert(equalMem(addr sigset1o, addr sigset2o, sizeof(Sigset)))
assert(selector.isEmpty())
result = true
@ -286,8 +288,8 @@ when not defined(windows):
events: set[Event]
proc vnode_test(): bool =
proc validate[T](test: openarray[ReadyKey[T]],
check: openarray[valType]): bool =
proc validate(test: openarray[ReadyKey],
check: openarray[valType]): bool =
result = false
if len(test) == len(check):
for checkItem in check:
@ -300,7 +302,7 @@ when not defined(windows):
if not result:
break
var res: seq[ReadyKey[int]]
var res: seq[ReadyKey]
var selector = newSelector[int]()
var events = {Event.VnodeWrite, Event.VnodeDelete, Event.VnodeExtend,
Event.VnodeAttrib, Event.VnodeLink, Event.VnodeRename,
@ -315,7 +317,7 @@ when not defined(windows):
raiseOsError(osLastError())
selector.registerVnode(dirfd, events, 1)
selector.flush()
discard selector.select(0)
# chmod testDirectory to 0777
chmodPath(testDirectory, 0x1FF)
@ -337,7 +339,6 @@ when not defined(windows):
# open test directory for watching
var testfd = openWatch(testDirectory & "/test")
selector.registerVnode(testfd, events, 2)
selector.flush()
doAssert(len(selector.select(0)) == 0)
# rename test directory
@ -381,7 +382,7 @@ when not defined(windows):
testfd = openWatch(testDirectory & "/testfile")
selector.registerVnode(testfd, events, 1)
selector.flush()
discard selector.select(0)
# write data to test file
writeFile(testDirectory & "/testfile", "TESTDATA")
@ -433,7 +434,6 @@ when not defined(windows):
proc event_wait_thread(event: SelectEvent) {.thread.} =
var selector = newSelector[int]()
selector.registerEvent(event, 1)
selector.flush()
var rc = selector.select(1000)
if len(rc) == 1:
inc(counter)
@ -573,15 +573,15 @@ else:
var selector = newSelector[int]()
var event = newSelectEvent()
selector.registerEvent(event, 1)
selector.flush()
discard selector.select(0)
event.setEvent()
var rc1 = selector.select(0)
event.setEvent()
var rc2 = selector.select(0)
var rc3 = selector.select(0)
assert(len(rc1) == 1 and len(rc2) == 1 and len(rc3) == 0)
var ev1 = rc1[0].data
var ev2 = rc2[0].data
var ev1 = selector.getData(rc1[0].fd)
var ev2 = selector.getData(rc2[0].fd)
assert(ev1 == 1 and ev2 == 1)
selector.unregister(event)
event.close()
@ -595,7 +595,6 @@ else:
proc event_wait_thread(event: SelectEvent) {.thread.} =
var selector = newSelector[int]()
selector.registerEvent(event, 1)
selector.flush()
var rc = selector.select(500)
if len(rc) == 1:
inc(counter)

View file

@ -1,5 +1,4 @@
discard """
cmd: "nim c -r -f $file"
output: '''
OK
OK