ORC/ARC async progress (#15370)

* ARC/ORC: fixes memory leak for empty seqs that have a non-zero capacity

* async: minor refactorings

* it helps to finish a refactoring
This commit is contained in:
Andreas Rumpf
2020-09-20 00:27:32 +02:00
committed by GitHub
parent cbdda631db
commit a15d77df7e
3 changed files with 10 additions and 11 deletions

View File

@@ -2164,7 +2164,7 @@ proc genMove(p: BProc; n: PNode; d: var TLoc) =
# generated by liftdestructors:
var src: TLoc
initLocExpr(p, n[2], src)
linefmt(p, cpsStmts, "if ($1.len && $1.p != $2.p) {", [rdLoc(a), rdLoc(src)])
linefmt(p, cpsStmts, "if ($1.p != $2.p) {", [rdLoc(a), rdLoc(src)])
genStmts(p, n[3])
linefmt(p, cpsStmts, "}$n$1.len = $2.len; $1.p = $2.p;$n", [rdLoc(a), rdLoc(src)])
else:

View File

@@ -1198,6 +1198,11 @@ else:
let p = getGlobalDispatcher()
not p.selector.isEmpty() or p.timers.len != 0 or p.callbacks.len != 0
proc prependSeq(dest: var seq[Callback]; src: sink seq[Callback]) =
let old = move dest
dest = src
dest.add old
proc processBasicCallbacks(
fd: AsyncFD, event: Event
): tuple[readCbListCount, writeCbListCount: int] =
@@ -1246,14 +1251,8 @@ else:
withData(selector, fd.int, fdData) do:
# Descriptor is still present in the queue.
case event
of Event.Read:
let oldReadList = move fdData.readList
fdData.readList = move newList
fdData.readList.add oldReadList
of Event.Write:
let oldWriteList = move fdData.writeList
fdData.writeList = move newList
fdData.writeList.add oldWriteList
of Event.Read: prependSeq(fdData.readList, newList)
of Event.Write: prependSeq(fdData.writeList, newList)
else:
assert false, "Cannot process callbacks for " & $event

View File

@@ -616,7 +616,7 @@ template withData*[T](s: Selector[T], fd: SocketHandle|int, value,
let fdi = int(fd)
s.checkFd(fdi)
if fdi in s:
var value = addr(s.getData(fdi))
var value = addr(s.fds[fdi].data)
body
template withData*[T](s: Selector[T], fd: SocketHandle|int, value, body1,
@@ -625,7 +625,7 @@ template withData*[T](s: Selector[T], fd: SocketHandle|int, value, body1,
let fdi = int(fd)
s.checkFd(fdi)
if fdi in s:
var value = addr(s.getData(fdi))
var value = addr(s.fds[fdi].data)
body1
else:
body2