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:
parent
cbdda631db
commit
a15d77df7e
3 changed files with 10 additions and 11 deletions
|
|
@ -2164,7 +2164,7 @@ proc genMove(p: BProc; n: PNode; d: var TLoc) =
|
||||||
# generated by liftdestructors:
|
# generated by liftdestructors:
|
||||||
var src: TLoc
|
var src: TLoc
|
||||||
initLocExpr(p, n[2], src)
|
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])
|
genStmts(p, n[3])
|
||||||
linefmt(p, cpsStmts, "}$n$1.len = $2.len; $1.p = $2.p;$n", [rdLoc(a), rdLoc(src)])
|
linefmt(p, cpsStmts, "}$n$1.len = $2.len; $1.p = $2.p;$n", [rdLoc(a), rdLoc(src)])
|
||||||
else:
|
else:
|
||||||
|
|
|
||||||
|
|
@ -1198,6 +1198,11 @@ else:
|
||||||
let p = getGlobalDispatcher()
|
let p = getGlobalDispatcher()
|
||||||
not p.selector.isEmpty() or p.timers.len != 0 or p.callbacks.len != 0
|
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(
|
proc processBasicCallbacks(
|
||||||
fd: AsyncFD, event: Event
|
fd: AsyncFD, event: Event
|
||||||
): tuple[readCbListCount, writeCbListCount: int] =
|
): tuple[readCbListCount, writeCbListCount: int] =
|
||||||
|
|
@ -1246,14 +1251,8 @@ else:
|
||||||
withData(selector, fd.int, fdData) do:
|
withData(selector, fd.int, fdData) do:
|
||||||
# Descriptor is still present in the queue.
|
# Descriptor is still present in the queue.
|
||||||
case event
|
case event
|
||||||
of Event.Read:
|
of Event.Read: prependSeq(fdData.readList, newList)
|
||||||
let oldReadList = move fdData.readList
|
of Event.Write: prependSeq(fdData.writeList, newList)
|
||||||
fdData.readList = move newList
|
|
||||||
fdData.readList.add oldReadList
|
|
||||||
of Event.Write:
|
|
||||||
let oldWriteList = move fdData.writeList
|
|
||||||
fdData.writeList = move newList
|
|
||||||
fdData.writeList.add oldWriteList
|
|
||||||
else:
|
else:
|
||||||
assert false, "Cannot process callbacks for " & $event
|
assert false, "Cannot process callbacks for " & $event
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -616,7 +616,7 @@ template withData*[T](s: Selector[T], fd: SocketHandle|int, value,
|
||||||
let fdi = int(fd)
|
let fdi = int(fd)
|
||||||
s.checkFd(fdi)
|
s.checkFd(fdi)
|
||||||
if fdi in s:
|
if fdi in s:
|
||||||
var value = addr(s.getData(fdi))
|
var value = addr(s.fds[fdi].data)
|
||||||
body
|
body
|
||||||
|
|
||||||
template withData*[T](s: Selector[T], fd: SocketHandle|int, value, body1,
|
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)
|
let fdi = int(fd)
|
||||||
s.checkFd(fdi)
|
s.checkFd(fdi)
|
||||||
if fdi in s:
|
if fdi in s:
|
||||||
var value = addr(s.getData(fdi))
|
var value = addr(s.fds[fdi].data)
|
||||||
body1
|
body1
|
||||||
else:
|
else:
|
||||||
body2
|
body2
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue