Skip to content

Commit a20b754

Browse files
committed
Replace use of LinkedList<T> with std::list for shared websocket buffers
Based on commit bd4631b of dumbfixes branch of 0xFEEDC0DE64 fork of ESPAsyncWebServer. Step one of removal of homebrewed LinkedList in favor of standard C++ containers. Incidentally, this also fixes an analog of bug me-no-dev#837 where removal of elements while iterating would invalidate the iterator and lead to memory corruption.
1 parent 600e1d1 commit a20b754

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

src/AsyncWebSocket.cpp

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,6 @@ AsyncWebSocket::AsyncWebSocket(const String& url)
934934
,_clients(LinkedList<AsyncWebSocketClient *>([](AsyncWebSocketClient *c){ delete c; }))
935935
,_cNextId(1)
936936
,_enabled(true)
937-
,_buffers(LinkedList<AsyncWebSocketMessageBuffer *>([](AsyncWebSocketMessageBuffer *b){ delete b; }))
938937
{
939938
_eventHandler = NULL;
940939
}
@@ -1300,22 +1299,23 @@ void AsyncWebSocket::handleRequest(AsyncWebServerRequest *request){
13001299

13011300
AsyncWebSocketMessageBuffer * AsyncWebSocket::makeBuffer(size_t size)
13021301
{
1303-
AsyncWebSocketMessageBuffer * buffer = new AsyncWebSocketMessageBuffer(size);
1304-
if (buffer) {
1302+
AsyncWebSocketMessageBuffer * buffer{};
1303+
{
13051304
AsyncWebLockGuard l(_lock);
1306-
_buffers.add(buffer);
1305+
_buffers.emplace_back(size);
1306+
buffer = &_buffers.back();
13071307
}
13081308
return buffer;
13091309
}
13101310

13111311
AsyncWebSocketMessageBuffer * AsyncWebSocket::makeBuffer(uint8_t * data, size_t size)
13121312
{
1313-
AsyncWebSocketMessageBuffer * buffer = new AsyncWebSocketMessageBuffer(data, size);
1313+
AsyncWebSocketMessageBuffer * buffer{};
13141314

1315-
if (buffer) {
1315+
{
13161316
AsyncWebLockGuard l(_lock);
1317-
// Serial.printf("Add to global buffers = %u\n", _buffers.length() + 1);
1318-
_buffers.add(buffer);
1317+
_buffers.emplace_back(data, size);
1318+
buffer = &_buffers.back();
13191319
}
13201320

13211321
return buffer;
@@ -1324,11 +1324,12 @@ AsyncWebSocketMessageBuffer * AsyncWebSocket::makeBuffer(uint8_t * data, size_t
13241324
void AsyncWebSocket::_cleanBuffers()
13251325
{
13261326
AsyncWebLockGuard l(_lock);
1327-
for(AsyncWebSocketMessageBuffer * c: _buffers){
1328-
if(c && c->canDelete()){
1329-
// Serial.printf("Remove from global buffers = %u\n", _buffers.length() - 1);
1330-
_buffers.remove(c);
1331-
}
1327+
1328+
for (auto iter = std::begin(_buffers); iter != std::end(_buffers);){
1329+
if(iter->canDelete()){
1330+
iter = _buffers.erase(iter);
1331+
} else
1332+
iter++;
13321333
}
13331334
}
13341335

src/AsyncWebSocket.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333

3434
#include "AsyncWebSynchronization.h"
3535

36+
#include <list>
37+
3638
#ifdef ESP8266
3739
#include <Hash.h>
3840
#ifdef CRYPTO_HASH_h // include Hash.h from espressif framework if the first include was from the crypto library
@@ -337,7 +339,7 @@ class AsyncWebSocket: public AsyncWebHandler {
337339
// messagebuffer functions/objects.
338340
AsyncWebSocketMessageBuffer * makeBuffer(size_t size = 0);
339341
AsyncWebSocketMessageBuffer * makeBuffer(uint8_t * data, size_t size);
340-
LinkedList<AsyncWebSocketMessageBuffer *> _buffers;
342+
std::list<AsyncWebSocketMessageBuffer> _buffers;
341343
void _cleanBuffers();
342344

343345
AsyncWebSocketClientLinkedList getClients() const;

0 commit comments

Comments
 (0)