Skip to content

Commit 9f49168

Browse files
authored
Merge pull request #49 from centurysys/fix/atomic-send
Send MQTT packets atomically in a single socket write
2 parents a586782 + ec84d0e commit 9f49168

1 file changed

Lines changed: 7 additions & 6 deletions

File tree

nmqtt.nim

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -356,24 +356,25 @@ proc send(ctx: MqttCtx, pkt: Pkt): Future[bool] {.async.} =
356356
if ctx.state notin {Connecting, Connected, Disconnecting}:
357357
return false
358358

359-
var hdr: seq[uint8]
360-
hdr.add (pkt.typ.int shl 4).uint8 or pkt.flags
359+
var buf: seq[uint8] = newSeqOfCap[uint8](1 + 4 + pkt.data.len)
360+
buf.add (pkt.typ.int shl 4).uint8 or pkt.flags
361361

362362
var len = pkt.data.len
363363
while true:
364364
var b = len mod 128
365365
len = len div 128
366366
if len > 0:
367367
b = b or 128
368-
hdr.add b.uint8
368+
buf.add b.uint8
369369
if len == 0:
370370
break
371371

372372
ctx.dmp "tx> " & $pkt
373-
await ctx.s.send(hdr[0].unsafeAddr, hdr.len)
374-
375373
if pkt.data.len > 0:
376-
await ctx.s.send(pkt.data[0].unsafeAddr, pkt.data.len)
374+
let hdrlen = buf.len
375+
buf.setLen(hdrlen + pkt.data.len)
376+
copyMem(buf[hdrlen].addr, pkt.data[0].unsafeAddr, pkt.data.len)
377+
await ctx.s.send(buf[0].unsafeAddr, buf.len)
377378

378379
return true
379380

0 commit comments

Comments
 (0)