From 4c5e225eeb342a3b9cfb2fbdddd92d00568b5553 Mon Sep 17 00:00:00 2001 From: Tanguy Date: Wed, 25 Jan 2023 17:56:42 +0100 Subject: [PATCH] Remove recvMsg pre-allocation (#136) --- nimble.lock | 153 -------------------------------------------- websock/session.nim | 20 +++--- 2 files changed, 12 insertions(+), 161 deletions(-) delete mode 100644 nimble.lock diff --git a/nimble.lock b/nimble.lock deleted file mode 100644 index 9616e9c..0000000 --- a/nimble.lock +++ /dev/null @@ -1,153 +0,0 @@ -{ - "version": 1, - "packages": { - "unittest2": { - "version": "0.0.4", - "vcsRevision": "f180f596c88dfd266f746ed6f8dbebce39c824db", - "url": "https://github.com/status-im/nim-unittest2.git", - "downloadMethod": "git", - "dependencies": [], - "checksums": { - "sha1": "fa309c41eaf6ef57895b9e603f2620a2f6e11780" - } - }, - "testutils": { - "version": "0.4.2", - "vcsRevision": "aa6e5216f4b4ab5aa971cdcdd70e1ec1203cedf2", - "url": "https://github.com/status-im/nim-testutils", - "downloadMethod": "git", - "dependencies": [ - "unittest2" - ], - "checksums": { - "sha1": "94427e0cce0e0c5841edcd3a6530b4e6b857a3cb" - } - }, - "stew": { - "version": "0.1.0", - "vcsRevision": "6ad35b876fb6ebe0dfee0f697af173acc47906ee", - "url": "https://github.com/status-im/nim-stew.git", - "downloadMethod": "git", - "dependencies": [], - "checksums": { - "sha1": "46d58c4feb457f3241e3347778334e325dce5268" - } - }, - "bearssl": { - "version": "0.1.5", - "vcsRevision": "ba80e2a0d7ae8aab666cee013e38ff8d33a3e5e7", - "url": "https://github.com/status-im/nim-bearssl", - "downloadMethod": "git", - "dependencies": [ - "unittest2" - ], - "checksums": { - "sha1": "383abd5becc77bf8e365b780a29d20529e1d9c4c" - } - }, - "httputils": { - "version": "0.3.0", - "vcsRevision": "689da19e9e9cfff4ced85e2b25c6b2b5598ed079", - "url": "https://github.com/status-im/nim-http-utils.git", - "downloadMethod": "git", - "dependencies": [ - "stew" - ], - "checksums": { - "sha1": "4ad3ad68d13c50184180ab4b2eacc0bd7ed2ed44" - } - }, - "chronos": { - "version": "3.0.11", - "vcsRevision": "17fed89c99beac5a92d3668d0d3e9b0e4ac13936", - "url": "https://github.com/status-im/nim-chronos.git", - "downloadMethod": "git", - "dependencies": [ - "stew", - "bearssl", - "httputils", - "unittest2" - ], - "checksums": { - "sha1": "f6fffc87571e5f76af2a77c4ebcc0e00909ced4e" - } - }, - "faststreams": { - "version": "0.3.0", - "vcsRevision": "1b561a9e71b6bdad1c1cdff753418906037e9d09", - "url": "https://github.com/status-im/nim-faststreams.git", - "downloadMethod": "git", - "dependencies": [ - "stew", - "testutils", - "chronos", - "unittest2" - ], - "checksums": { - "sha1": "97edf9797924af48566a0af8267203dc21d80c77" - } - }, - "serialization": { - "version": "0.1.0", - "vcsRevision": "fcd0eadadde0ee000a63df8ab21dc4e9f015a790", - "url": "https://github.com/status-im/nim-serialization.git", - "downloadMethod": "git", - "dependencies": [ - "faststreams", - "unittest2", - "stew" - ], - "checksums": { - "sha1": "fef59519892cac70cccd81b612085caaa5e3e6cf" - } - }, - "json_serialization": { - "version": "0.1.0", - "vcsRevision": "c5f0e2465e8375dfc7aa0f56ccef67cb680bc6b0", - "url": "https://github.com/status-im/nim-json-serialization.git", - "downloadMethod": "git", - "dependencies": [ - "serialization", - "stew" - ], - "checksums": { - "sha1": "d89d79d0679a3a41b350e3ad4be56c0308cc5ec6" - } - }, - "chronicles": { - "version": "0.10.2", - "vcsRevision": "1682096306ddba8185dcfac360a8c3f952d721e4", - "url": "https://github.com/status-im/nim-chronicles.git", - "downloadMethod": "git", - "dependencies": [ - "testutils", - "json_serialization" - ], - "checksums": { - "sha1": "9a5bebb76b0f7d587a31e621d260119279e91c76" - } - }, - "zlib": { - "version": "0.1.0", - "vcsRevision": "74cdeb54b21bededb5a515d36f608bc1850555a2", - "url": "https://github.com/status-im/nim-zlib", - "downloadMethod": "git", - "dependencies": [ - "stew" - ], - "checksums": { - "sha1": "01d330dc4c1924e56b1559ee73bc760e526f635c" - } - }, - "nimcrypto": { - "version": "0.5.4", - "vcsRevision": "a5742a9a214ac33f91615f3862c7b099aec43b00", - "url": "https://github.com/cheatfate/nimcrypto", - "downloadMethod": "git", - "dependencies": [], - "checksums": { - "sha1": "f76c87707cd4e96355b8bb6ef27e7f8b0aac1e08" - } - } - } -} \ No newline at end of file diff --git a/websock/session.nim b/websock/session.nim index 4710616..bda209a 100644 --- a/websock/session.nim +++ b/websock/session.nim @@ -349,7 +349,7 @@ proc ping*( proc recv*( ws: WSSession, - data: pointer, + data: pointer | ptr byte | ref seq[byte], # nim bug: pointer doesn't match ptr byte? size: int): Future[int] {.async.} = ## Attempts to read up to ``size`` bytes ## @@ -371,7 +371,8 @@ proc recv*( defer: ws.reading = false var consumed = 0 - var pbuffer = cast[ptr UncheckedArray[byte]](data) + when data is pointer or data is ptr byte: + let pbuffer = cast[ptr UncheckedArray[byte]](data) try: if isNil(ws.frame): ws.frame = await ws.readFrame(ws.extensions) @@ -404,7 +405,11 @@ proc recv*( let len = min(ws.frame.remainder.int, size - consumed) if len > 0: trace "Reading bytes from frame stream", len - let read = await ws.frame.read(ws.stream.reader, addr pbuffer[consumed], len) + when data is ref seq[byte]: + data[].setLen(consumed + len) + let read = await ws.frame.read(ws.stream.reader, addr data[][consumed], len) + else: + let read = await ws.frame.read(ws.stream.reader, addr pbuffer[consumed], len) if read <= 0: trace "Didn't read any bytes, stopping" raise newException(WSClosedError, "WebSocket is closed!") @@ -455,15 +460,14 @@ proc recvMsg*( try: var res: seq[byte] while ws.readyState != ReadyState.Closed: - var buf = newSeq[byte](min(size, ws.frameSize)) - let read = await ws.recv(addr buf[0], buf.len) + var buf = new(seq[byte]) + let read = await ws.recv(buf, min(size, ws.frameSize)) - buf.setLen(read) - if res.len + buf.len > size: + if res.len + buf[].len > size: raise newException(WSMaxMessageSizeError, "Max message size exceeded") trace "Read message", size = read - res.add(buf) + res.add(buf[]) # no more frames if isNil(ws.frame):