From c102deac9db36031415933f13b696f0bb716419f Mon Sep 17 00:00:00 2001 From: cheatfate Date: Fri, 15 Jun 2018 15:09:44 +0300 Subject: [PATCH] Fix stream.nim write() GC functions. --- asyncdispatch2/transports/datagram.nim | 8 ++++---- asyncdispatch2/transports/stream.nim | 18 +++++++++++------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/asyncdispatch2/transports/datagram.nim b/asyncdispatch2/transports/datagram.nim index 53cd349..6e4e25e 100644 --- a/asyncdispatch2/transports/datagram.nim +++ b/asyncdispatch2/transports/datagram.nim @@ -572,7 +572,7 @@ proc send*(transp: DatagramTransport, msg: string, msglen = -1): Future[void] = if not isLiteral(msg): shallowCopy(retFuture.gcholder, msg) let length = if msglen <= 0: len(msg) else: msglen - let vector = GramVector(kind: WithoutAddress, buf: unsafeAddr msg[0], + let vector = GramVector(kind: WithoutAddress, buf: addr retFuture.gcholder[0], buflen: len(msg), writer: cast[Future[void]](retFuture)) transp.queue.addLast(vector) @@ -589,7 +589,7 @@ proc send*[T](transp: DatagramTransport, msg: seq[T], if not isLiteral(msg): shallowCopy(retFuture.gcholder, msg) let length = if msglen <= 0: (len(msg) * sizeof(T)) else: (msglen * sizeof(T)) - let vector = GramVector(kind: WithoutAddress, buf: unsafeAddr msg[0], + let vector = GramVector(kind: WithoutAddress, buf: addr retFuture.gcholder[0], buflen: length, writer: cast[Future[void]](retFuture)) transp.queue.addLast(vector) @@ -619,7 +619,7 @@ proc sendTo*(transp: DatagramTransport, remote: TransportAddress, if not isLiteral(msg): shallowCopy(retFuture.gcholder, msg) let length = if msglen <= 0: len(msg) else: msglen - let vector = GramVector(kind: WithAddress, buf: unsafeAddr msg[0], + let vector = GramVector(kind: WithAddress, buf: addr retFuture.gcholder[0], buflen: length, writer: cast[Future[void]](retFuture), address: remote) @@ -637,7 +637,7 @@ proc sendTo*[T](transp: DatagramTransport, remote: TransportAddress, if not isLiteral(msg): shallowCopy(retFuture.gcholder, msg) let length = if msglen <= 0: (len(msg) * sizeof(T)) else: (msglen * sizeof(T)) - let vector = GramVector(kind: WithAddress, buf: unsafeAddr msg[0], + let vector = GramVector(kind: WithAddress, buf: addr retFuture.gcholder[0], buflen: length, writer: cast[Future[void]](retFuture), address: remote) diff --git a/asyncdispatch2/transports/stream.nim b/asyncdispatch2/transports/stream.nim index 6bb371a..bfabd55 100644 --- a/asyncdispatch2/transports/stream.nim +++ b/asyncdispatch2/transports/stream.nim @@ -881,28 +881,32 @@ proc write*(transp: StreamTransport, pbytes: pointer, transp.resumeWrite() return retFuture -proc write*(transp: StreamTransport, msg: var string): Future[int] = +proc write*(transp: StreamTransport, msg: string, msglen = -1): Future[int] = ## Write data from string ``msg`` using transport ``transp``. var retFuture = FutureGCString[int]() transp.checkClosed(retFuture) - shallowCopy(retFuture.gcholder, msg) + if not isLiteral(msg): + shallowCopy(retFuture.gcholder, msg) + let length = if msglen <= 0: len(msg) else: msglen var vector = StreamVector(kind: DataBuffer, writer: cast[Future[int]](retFuture), - buf: unsafeAddr msg[0], buflen: len(msg)) + buf: addr retFuture.gcholder[0], buflen: length) transp.queue.addLast(vector) if WritePaused in transp.state: transp.resumeWrite() return retFuture -proc write*[T](transp: StreamTransport, msg: var seq[T]): Future[int] = +proc write*[T](transp: StreamTransport, msg: seq[T], msglen = -1): Future[int] = ## Write sequence ``msg`` using transport ``transp``. var retFuture = FutureGCSeq[int, T]() transp.checkClosed(retFuture) - shallowCopy(retFuture.gcholder, msg) + if not isLiteral(msg): + shallowCopy(retFuture.gcholder, msg) + let length = if msglen <= 0: (len(msg) * sizeof(T)) else: (msglen * sizeof(T)) var vector = StreamVector(kind: DataBuffer, writer: cast[Future[int]](retFuture), - buf: unsafeAddr msg[0], - buflen: len(msg) * sizeof(T)) + buf: addr retFuture.gcholder[0], + buflen: length) transp.queue.addLast(vector) if WritePaused in transp.state: transp.resumeWrite()