From 468ca4771ca34193971536deeff816d47a2d42a7 Mon Sep 17 00:00:00 2001 From: Wiebe Cazemier Date: Sat, 27 Feb 2021 15:34:08 +0100 Subject: [PATCH] Refactor code to use new interface on CirBuf --- cirbuf.cpp | 12 ++++++------ cirbuf.h | 3 ++- client.cpp | 36 ++++-------------------------------- mqttpacket.cpp | 13 +------------ 4 files changed, 13 insertions(+), 51 deletions(-) diff --git a/cirbuf.cpp b/cirbuf.cpp index 3ea3bce..0cf7593 100644 --- a/cirbuf.cpp +++ b/cirbuf.cpp @@ -90,20 +90,20 @@ char CirBuf::peakAhead(uint32_t offset) const return b; } -void CirBuf::ensureFreeSpace(size_t n) +void CirBuf::ensureFreeSpace(size_t n, const size_t max) { + if (n <= freeSpace()) + return; + const size_t _usedBytes = usedBytes(); int mul = 1; - while((mul * size - _usedBytes - 1) < n) + while((mul * size - _usedBytes - 1) < n && (mul*size) < max) { mul = mul << 1; } - if (mul == 1) - return; - doubleSize(mul); } @@ -223,5 +223,5 @@ void CirBuf::read(void *buf, const size_t count) _packet_len -= readlen; } assert(_packet_len == 0); - assert(i == _packet_len); + assert(i == static_cast(count)); } diff --git a/cirbuf.h b/cirbuf.h index d2eca01..bd77060 100644 --- a/cirbuf.h +++ b/cirbuf.h @@ -4,6 +4,7 @@ #include #include #include +#include // Optimized circular buffer, works only with sizes power of two. class CirBuf @@ -32,7 +33,7 @@ public: void advanceHead(uint32_t n); void advanceTail(uint32_t n); char peakAhead(uint32_t offset) const; - void ensureFreeSpace(size_t n); + void ensureFreeSpace(size_t n, const size_t max = UINT_MAX); void doubleSize(uint factor = 2); uint32_t getSize() const; diff --git a/client.cpp b/client.cpp index a7ed216..e7fb8d9 100644 --- a/client.cpp +++ b/client.cpp @@ -147,10 +147,7 @@ void Client::writeMqttPacket(const MqttPacket &packet) const uint32_t growBufMaxTo = std::min(packet.getSizeIncludingNonPresentHeader() * 1000, maxPacketSize); // Grow as far as we can. We have to make room for one MQTT packet. - while (packet.getSizeIncludingNonPresentHeader() > writebuf.freeSpace() && writebuf.getSize() < growBufMaxTo) - { - writebuf.doubleSize(); - } + writebuf.ensureFreeSpace(packet.getSizeIncludingNonPresentHeader(), growBufMaxTo); // And drop a publish when it doesn't fit, even after resizing. This means we do allow pings. And // QoS packet are queued and limited elsewhere. @@ -164,34 +161,10 @@ void Client::writeMqttPacket(const MqttPacket &packet) writebuf.headPtr()[0] = packet.getFirstByte(); writebuf.advanceHead(1); RemainingLength r = packet.getRemainingLength(); - - ssize_t len_left = r.len; - int src_i = 0; - while (len_left > 0) - { - const size_t len = std::min(len_left, writebuf.maxWriteSize()); - assert(len > 0); - std::memcpy(writebuf.headPtr(), &r.bytes[src_i], len); - writebuf.advanceHead(len); - src_i += len; - len_left -= len; - } - assert(len_left == 0); - assert(src_i == r.len); + writebuf.write(r.bytes, r.len); } - ssize_t len_left = packet.getBites().size(); - int src_i = 0; - while (len_left > 0) - { - const size_t len = std::min(len_left, writebuf.maxWriteSize()); - assert(len > 0); - std::memcpy(writebuf.headPtr(), &packet.getBites()[src_i], len); - writebuf.advanceHead(len); - src_i += len; - len_left -= len; - } - assert(len_left == 0); + writebuf.write(packet.getBites().data(), packet.getBites().size()); if (packet.packetType == PacketType::DISCONNECT) setReadyForDisconnect(); @@ -217,8 +190,7 @@ void Client::writePingResp() { std::lock_guard locker(writeBufMutex); - if (2 > writebuf.freeSpace()) - writebuf.doubleSize(); + writebuf.ensureFreeSpace(2); writebuf.headPtr()[0] = 0b11010000; writebuf.advanceHead(1); diff --git a/mqttpacket.cpp b/mqttpacket.cpp index bf1e5f3..2b940ee 100644 --- a/mqttpacket.cpp +++ b/mqttpacket.cpp @@ -17,18 +17,7 @@ MqttPacket::MqttPacket(CirBuf &buf, size_t packet_len, size_t fixed_header_lengt fixed_header_length(fixed_header_length), sender(sender) { - int i = 0; - ssize_t _packet_len = packet_len; - while (_packet_len > 0) - { - int readlen = std::min(buf.maxReadSize(), _packet_len); - assert(readlen > 0); - std::memcpy(&bites[i], buf.tailPtr(), readlen); - buf.advanceTail(readlen); - i += readlen; - _packet_len -= readlen; - } - assert(_packet_len == 0); + buf.read(bites.data(), packet_len); first_byte = bites[0]; unsigned char _packetType = (first_byte & 0xF0) >> 4; -- libgit2 0.21.4