From 549bab15104f2c8615960ac4be9bb24dd6cd5bf8 Mon Sep 17 00:00:00 2001 From: cheatfate Date: Wed, 25 Jul 2018 07:05:52 +0300 Subject: [PATCH] Fix `yield nil`. --- asyncdispatch2/transports/stream.nim | 33 +++++++++++++++------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/asyncdispatch2/transports/stream.nim b/asyncdispatch2/transports/stream.nim index ab8140a..ea04010 100644 --- a/asyncdispatch2/transports/stream.nim +++ b/asyncdispatch2/transports/stream.nim @@ -964,11 +964,12 @@ proc readExactly*(transp: StreamTransport, pbytes: pointer, addr(transp.buffer[0]), transp.offset) index += transp.offset - transp.reader = newFuture[void]("stream.transport.readExactly") + var fut = newFuture[void]("stream.transport.readExactly") + transp.reader = fut transp.offset = 0 if ReadPaused in transp.state: transp.resumeRead() - await transp.reader + await fut proc readOnce*(transp: StreamTransport, pbytes: pointer, nbytes: int): Future[int] {.async.} = @@ -985,13 +986,11 @@ proc readOnce*(transp: StreamTransport, pbytes: pointer, if (ReadClosed in transp.state) or transp.atEof(): result = 0 break - transp.reader = newFuture[void]("stream.transport.readOnce") + var fut = newFuture[void]("stream.transport.readOnce") + transp.reader = fut if ReadPaused in transp.state: transp.resumeRead() - await transp.reader - # we need to clear transp.reader to avoid double completion of this - # Future[T], because readLoop continues working. - transp.reader = nil + await fut else: if transp.offset > nbytes: copyMem(pbytes, addr(transp.buffer[0]), nbytes) @@ -1052,10 +1051,11 @@ proc readUntil*(transp: StreamTransport, pbytes: pointer, nbytes: int, break else: transp.shiftBuffer(transp.offset) - transp.reader = newFuture[void]("stream.transport.readUntil") + var fut = newFuture[void]("stream.transport.readUntil") + transp.reader = fut if ReadPaused in transp.state: transp.resumeRead() - await transp.reader + await fut proc readLine*(transp: StreamTransport, limit = 0, sep = "\r\n"): Future[string] {.async.} = @@ -1103,10 +1103,11 @@ proc readLine*(transp: StreamTransport, limit = 0, break else: transp.shiftBuffer(transp.offset) - transp.reader = newFuture[void]("stream.transport.readLine") + var fut = newFuture[void]("stream.transport.readLine") + transp.reader = fut if ReadPaused in transp.state: transp.resumeRead() - await transp.reader + await fut proc read*(transp: StreamTransport, n = -1): Future[seq[byte]] {.async.} = ## Read all bytes (n == -1) or exactly `n` bytes from transport ``transp``. @@ -1146,10 +1147,11 @@ proc read*(transp: StreamTransport, n = -1): Future[seq[byte]] {.async.} = transp.offset) transp.offset = 0 - transp.reader = newFuture[void]("stream.transport.read") + var fut = newFuture[void]("stream.transport.read") + transp.reader = fut if ReadPaused in transp.state: transp.resumeRead() - await transp.reader + await fut proc consume*(transp: StreamTransport, n = -1): Future[int] {.async.} = ## Consume all bytes (n == -1) or ``n`` bytes from transport ``transp``. @@ -1181,10 +1183,11 @@ proc consume*(transp: StreamTransport, n = -1): Future[int] {.async.} = result += transp.offset transp.offset = 0 - transp.reader = newFuture[void]("stream.transport.consume") + var fut = newFuture[void]("stream.transport.consume") + transp.reader = fut if ReadPaused in transp.state: transp.resumeRead() - await transp.reader + await fut proc join*(transp: StreamTransport) {.async.} = ## Wait until ``transp`` will not be closed.