Commit 468ca4771ca34193971536deeff816d47a2d42a7

Authored by Wiebe Cazemier
1 parent b5ba41f5

Refactor code to use new interface on CirBuf

And fixed an assert in CirBuf.read().
cirbuf.cpp
@@ -90,20 +90,20 @@ char CirBuf::peakAhead(uint32_t offset) const @@ -90,20 +90,20 @@ char CirBuf::peakAhead(uint32_t offset) const
90 return b; 90 return b;
91 } 91 }
92 92
93 -void CirBuf::ensureFreeSpace(size_t n) 93 +void CirBuf::ensureFreeSpace(size_t n, const size_t max)
94 { 94 {
  95 + if (n <= freeSpace())
  96 + return;
  97 +
95 const size_t _usedBytes = usedBytes(); 98 const size_t _usedBytes = usedBytes();
96 99
97 int mul = 1; 100 int mul = 1;
98 101
99 - while((mul * size - _usedBytes - 1) < n) 102 + while((mul * size - _usedBytes - 1) < n && (mul*size) < max)
100 { 103 {
101 mul = mul << 1; 104 mul = mul << 1;
102 } 105 }
103 106
104 - if (mul == 1)  
105 - return;  
106 -  
107 doubleSize(mul); 107 doubleSize(mul);
108 } 108 }
109 109
@@ -223,5 +223,5 @@ void CirBuf::read(void *buf, const size_t count) @@ -223,5 +223,5 @@ void CirBuf::read(void *buf, const size_t count)
223 _packet_len -= readlen; 223 _packet_len -= readlen;
224 } 224 }
225 assert(_packet_len == 0); 225 assert(_packet_len == 0);
226 - assert(i == _packet_len); 226 + assert(i == static_cast<int>(count));
227 } 227 }
cirbuf.h
@@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
4 #include <stddef.h> 4 #include <stddef.h>
5 #include <stdlib.h> 5 #include <stdlib.h>
6 #include <stdint.h> 6 #include <stdint.h>
  7 +#include <limits.h>
7 8
8 // Optimized circular buffer, works only with sizes power of two. 9 // Optimized circular buffer, works only with sizes power of two.
9 class CirBuf 10 class CirBuf
@@ -32,7 +33,7 @@ public: @@ -32,7 +33,7 @@ public:
32 void advanceHead(uint32_t n); 33 void advanceHead(uint32_t n);
33 void advanceTail(uint32_t n); 34 void advanceTail(uint32_t n);
34 char peakAhead(uint32_t offset) const; 35 char peakAhead(uint32_t offset) const;
35 - void ensureFreeSpace(size_t n); 36 + void ensureFreeSpace(size_t n, const size_t max = UINT_MAX);
36 void doubleSize(uint factor = 2); 37 void doubleSize(uint factor = 2);
37 uint32_t getSize() const; 38 uint32_t getSize() const;
38 39
client.cpp
@@ -147,10 +147,7 @@ void Client::writeMqttPacket(const MqttPacket &amp;packet) @@ -147,10 +147,7 @@ void Client::writeMqttPacket(const MqttPacket &amp;packet)
147 const uint32_t growBufMaxTo = std::min<int>(packet.getSizeIncludingNonPresentHeader() * 1000, maxPacketSize); 147 const uint32_t growBufMaxTo = std::min<int>(packet.getSizeIncludingNonPresentHeader() * 1000, maxPacketSize);
148 148
149 // Grow as far as we can. We have to make room for one MQTT packet. 149 // Grow as far as we can. We have to make room for one MQTT packet.
150 - while (packet.getSizeIncludingNonPresentHeader() > writebuf.freeSpace() && writebuf.getSize() < growBufMaxTo)  
151 - {  
152 - writebuf.doubleSize();  
153 - } 150 + writebuf.ensureFreeSpace(packet.getSizeIncludingNonPresentHeader(), growBufMaxTo);
154 151
155 // And drop a publish when it doesn't fit, even after resizing. This means we do allow pings. And 152 // And drop a publish when it doesn't fit, even after resizing. This means we do allow pings. And
156 // QoS packet are queued and limited elsewhere. 153 // QoS packet are queued and limited elsewhere.
@@ -164,34 +161,10 @@ void Client::writeMqttPacket(const MqttPacket &amp;packet) @@ -164,34 +161,10 @@ void Client::writeMqttPacket(const MqttPacket &amp;packet)
164 writebuf.headPtr()[0] = packet.getFirstByte(); 161 writebuf.headPtr()[0] = packet.getFirstByte();
165 writebuf.advanceHead(1); 162 writebuf.advanceHead(1);
166 RemainingLength r = packet.getRemainingLength(); 163 RemainingLength r = packet.getRemainingLength();
167 -  
168 - ssize_t len_left = r.len;  
169 - int src_i = 0;  
170 - while (len_left > 0)  
171 - {  
172 - const size_t len = std::min<int>(len_left, writebuf.maxWriteSize());  
173 - assert(len > 0);  
174 - std::memcpy(writebuf.headPtr(), &r.bytes[src_i], len);  
175 - writebuf.advanceHead(len);  
176 - src_i += len;  
177 - len_left -= len;  
178 - }  
179 - assert(len_left == 0);  
180 - assert(src_i == r.len); 164 + writebuf.write(r.bytes, r.len);
181 } 165 }
182 166
183 - ssize_t len_left = packet.getBites().size();  
184 - int src_i = 0;  
185 - while (len_left > 0)  
186 - {  
187 - const size_t len = std::min<int>(len_left, writebuf.maxWriteSize());  
188 - assert(len > 0);  
189 - std::memcpy(writebuf.headPtr(), &packet.getBites()[src_i], len);  
190 - writebuf.advanceHead(len);  
191 - src_i += len;  
192 - len_left -= len;  
193 - }  
194 - assert(len_left == 0); 167 + writebuf.write(packet.getBites().data(), packet.getBites().size());
195 168
196 if (packet.packetType == PacketType::DISCONNECT) 169 if (packet.packetType == PacketType::DISCONNECT)
197 setReadyForDisconnect(); 170 setReadyForDisconnect();
@@ -217,8 +190,7 @@ void Client::writePingResp() @@ -217,8 +190,7 @@ void Client::writePingResp()
217 { 190 {
218 std::lock_guard<std::mutex> locker(writeBufMutex); 191 std::lock_guard<std::mutex> locker(writeBufMutex);
219 192
220 - if (2 > writebuf.freeSpace())  
221 - writebuf.doubleSize(); 193 + writebuf.ensureFreeSpace(2);
222 194
223 writebuf.headPtr()[0] = 0b11010000; 195 writebuf.headPtr()[0] = 0b11010000;
224 writebuf.advanceHead(1); 196 writebuf.advanceHead(1);
mqttpacket.cpp
@@ -17,18 +17,7 @@ MqttPacket::MqttPacket(CirBuf &amp;buf, size_t packet_len, size_t fixed_header_lengt @@ -17,18 +17,7 @@ MqttPacket::MqttPacket(CirBuf &amp;buf, size_t packet_len, size_t fixed_header_lengt
17 fixed_header_length(fixed_header_length), 17 fixed_header_length(fixed_header_length),
18 sender(sender) 18 sender(sender)
19 { 19 {
20 - int i = 0;  
21 - ssize_t _packet_len = packet_len;  
22 - while (_packet_len > 0)  
23 - {  
24 - int readlen = std::min<int>(buf.maxReadSize(), _packet_len);  
25 - assert(readlen > 0);  
26 - std::memcpy(&bites[i], buf.tailPtr(), readlen);  
27 - buf.advanceTail(readlen);  
28 - i += readlen;  
29 - _packet_len -= readlen;  
30 - }  
31 - assert(_packet_len == 0); 20 + buf.read(bites.data(), packet_len);
32 21
33 first_byte = bites[0]; 22 first_byte = bites[0];
34 unsigned char _packetType = (first_byte & 0xF0) >> 4; 23 unsigned char _packetType = (first_byte & 0xF0) >> 4;