diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2020-09-20 00:27:32 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-20 00:27:32 +0200 |
commit | a15d77df7e324f6cda831bf44ced7a5a8bd93ef4 (patch) | |
tree | 1084cf8bf3160e5d15f61178f836819a26d20a65 | |
parent | cbdda631dbd68765203d1843f217f47c6e0c5c48 (diff) | |
download | Nim-a15d77df7e324f6cda831bf44ced7a5a8bd93ef4.tar.gz |
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
-rw-r--r-- | compiler/ccgexprs.nim | 2 | ||||
-rw-r--r-- | lib/pure/asyncdispatch.nim | 15 | ||||
-rw-r--r-- | lib/pure/ioselects/ioselectors_kqueue.nim | 4 |
3 files changed, 10 insertions, 11 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index 0d235f62e..83f7f7278 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -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: diff --git a/lib/pure/asyncdispatch.nim b/lib/pure/asyncdispatch.nim index 5cb56f4e4..d8b274c34 100644 --- a/lib/pure/asyncdispatch.nim +++ b/lib/pure/asyncdispatch.nim @@ -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 diff --git a/lib/pure/ioselects/ioselectors_kqueue.nim b/lib/pure/ioselects/ioselectors_kqueue.nim index 7635a04d5..a65be9842 100644 --- a/lib/pure/ioselects/ioselectors_kqueue.nim +++ b/lib/pure/ioselects/ioselectors_kqueue.nim @@ -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 |