Skip to content

Commit 8feb673

Browse files
committed
_controlQueue is now a std::deque
Based on commit f5e439c of dumbfixes branch of 0xFEEDC0DE64 fork of ESPAsyncWebServer. Unlike the original patch, clearing the std::queue using assignment of {} is not supported in C++11, and no other method of clearing the queue is available, so this forces use of std::deque instead. This in turn forces all methods of std::queue to be replaced with their underlying equivalents in std::deque. Control messages are constructed directly inside the container using .emplace_back() (.emplace() in the original patch) instead of building the message and passing its pointer as a parameter.
1 parent bf72f54 commit 8feb673

File tree

2 files changed

+29
-28
lines changed

2 files changed

+29
-28
lines changed

src/AsyncWebSocket.cpp

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -522,8 +522,7 @@ AsyncWebSocketMultiMessage::~AsyncWebSocketMultiMessage() {
522522
const size_t AWSC_PING_PAYLOAD_LEN = 22;
523523

524524
AsyncWebSocketClient::AsyncWebSocketClient(AsyncWebServerRequest *request, AsyncWebSocket *server)
525-
: _controlQueue(LinkedList<AsyncWebSocketControl *>([](AsyncWebSocketControl *c){ delete c; }))
526-
, _messageQueue(LinkedList<AsyncWebSocketMessage *>([](AsyncWebSocketMessage *m){ delete m; }))
525+
: _messageQueue(LinkedList<AsyncWebSocketMessage *>([](AsyncWebSocketMessage *m){ delete m; }))
527526
, _tempObject(NULL)
528527
{
529528
_client = request->client();
@@ -548,7 +547,7 @@ AsyncWebSocketClient::AsyncWebSocketClient(AsyncWebServerRequest *request, Async
548547
AsyncWebSocketClient::~AsyncWebSocketClient(){
549548
// Serial.printf("%u FREE Q\n", id());
550549
_messageQueue.free();
551-
_controlQueue.free();
550+
_controlQueue.clear();
552551
_server->_cleanBuffers();
553552
_server->_handleEvent(this, WS_EVT_DISCONNECT, NULL, NULL, 0);
554553
}
@@ -562,17 +561,17 @@ void AsyncWebSocketClient::_clearQueue(){
562561
void AsyncWebSocketClient::_onAck(size_t len, uint32_t time){
563562
// Serial.printf("%u onAck\n", id());
564563
_lastMessageTime = millis();
565-
if(!_controlQueue.isEmpty()){
566-
auto head = _controlQueue.front();
567-
if(head->finished()){
568-
len -= head->len();
569-
if(_status == WS_DISCONNECTING && head->opcode() == WS_DISCONNECT){
570-
_controlQueue.remove(head);
564+
if(!_controlQueue.empty()){
565+
auto &head = _controlQueue.front();
566+
if(head.finished()){
567+
len -= head.len();
568+
if(_status == WS_DISCONNECTING && head.opcode() == WS_DISCONNECT){
569+
_controlQueue.pop_front();
571570
_status = WS_DISCONNECTED;
572571
_client->close(true);
573572
return;
574573
}
575-
_controlQueue.remove(head);
574+
_controlQueue.pop_front();
576575
}
577576
}
578577

@@ -588,10 +587,9 @@ void AsyncWebSocketClient::_onAck(size_t len, uint32_t time){
588587
}
589588

590589
void AsyncWebSocketClient::_onPoll(){
591-
if(_client->canSend() && (!_controlQueue.isEmpty() || !_messageQueue.isEmpty())){
592-
// Serial.println("RUN 2");
590+
if(_client->canSend() && (!_controlQueue.empty() || !_messageQueue.isEmpty())){
593591
_runQueue();
594-
} else if(_keepAlivePeriod > 0 && _controlQueue.isEmpty() && _messageQueue.isEmpty() && (millis() - _lastMessageTime) >= _keepAlivePeriod){
592+
} else if(_keepAlivePeriod > 0 && _controlQueue.empty() && _messageQueue.isEmpty() && (millis() - _lastMessageTime) >= _keepAlivePeriod){
595593
ping((uint8_t *)AWSC_PING_PAYLOAD, AWSC_PING_PAYLOAD_LEN);
596594
}
597595
}
@@ -602,9 +600,9 @@ void AsyncWebSocketClient::_runQueue(){
602600
//size_t m0 = _messageQueue.isEmpty()? 0 : _messageQueue.length();
603601
//size_t m1 = _messageQueue.isEmpty()? 0 : _messageQueue.front()->betweenFrames();
604602
// Serial.printf("%u R C = %u %u\n", _clientId, m0, m1);
605-
if(!_controlQueue.isEmpty() && (_messageQueue.isEmpty() || _messageQueue.front()->betweenFrames()) && webSocketSendFrameWindow(_client) > (size_t)(_controlQueue.front()->len() - 1)){
603+
if(!_controlQueue.empty() && (_messageQueue.isEmpty() || _messageQueue.front()->betweenFrames()) && webSocketSendFrameWindow(_client) > (size_t)(_controlQueue.front().len() - 1)){
606604
// Serial.printf("%u R S C\n", _clientId);
607-
_controlQueue.front()->send(_client);
605+
_controlQueue.front().send(_client);
608606
} else if(!_messageQueue.isEmpty() && _messageQueue.front()->betweenFrames() && webSocketSendFrameWindow(_client)){
609607
// Serial.printf("%u R S M = ", _clientId);
610608
_messageQueue.front()->send(_client);
@@ -617,6 +615,10 @@ bool AsyncWebSocketClient::queueIsFull() const {
617615
return (_messageQueue.length() >= WS_MAX_QUEUED_MESSAGES) || (_status != WS_CONNECTED);
618616
}
619617

618+
size_t AsyncWebSocketClient::queueLen() const {
619+
return _messageQueue.length() + _controlQueue.size();
620+
}
621+
620622
void AsyncWebSocketClient::_queueMessage(AsyncWebSocketMessage *dataMessage){
621623
if(dataMessage == NULL){
622624
// Serial.printf("%u Q1\n", _clientId);
@@ -642,11 +644,9 @@ void AsyncWebSocketClient::_queueMessage(AsyncWebSocketMessage *dataMessage){
642644
}
643645
}
644646

645-
void AsyncWebSocketClient::_queueControl(AsyncWebSocketControl *controlMessage){
646-
if(controlMessage == NULL)
647-
return;
648-
_controlQueue.add(controlMessage);
649-
if(_client->canSend()) {
647+
void AsyncWebSocketClient::_queueControl(uint8_t opcode, uint8_t *data, size_t len, bool mask){
648+
_controlQueue.emplace_back(opcode, data, len, mask);
649+
if (_client->canSend()) {
650650
// Serial.println("RUN 4");
651651
_runQueue();
652652
}
@@ -669,17 +669,17 @@ void AsyncWebSocketClient::close(uint16_t code, const char * message){
669669
if(message != NULL){
670670
memcpy(buf+2, message, packetLen -2);
671671
}
672-
_queueControl(new AsyncWebSocketControl(WS_DISCONNECT,(uint8_t*)buf,packetLen));
672+
_queueControl(WS_DISCONNECT, (uint8_t*)buf, packetLen);
673673
free(buf);
674674
return;
675675
}
676676
}
677-
_queueControl(new AsyncWebSocketControl(WS_DISCONNECT));
677+
_queueControl(WS_DISCONNECT);
678678
}
679679

680680
void AsyncWebSocketClient::ping(uint8_t *data, size_t len){
681681
if(_status == WS_CONNECTED)
682-
_queueControl(new AsyncWebSocketControl(WS_PING, data, len));
682+
_queueControl(WS_PING, data, len);
683683
}
684684

685685
void AsyncWebSocketClient::_onError(int8_t){
@@ -765,10 +765,10 @@ void AsyncWebSocketClient::_onData(void *pbuf, size_t plen){
765765
} else {
766766
_status = WS_DISCONNECTING;
767767
_client->ackLater();
768-
_queueControl(new AsyncWebSocketControl(WS_DISCONNECT, data, datalen));
768+
_queueControl(WS_DISCONNECT, data, datalen);
769769
}
770770
} else if(_pinfo.opcode == WS_PING){
771-
_queueControl(new AsyncWebSocketControl(WS_PONG, data, datalen));
771+
_queueControl(WS_PONG, data, datalen);
772772
} else if(_pinfo.opcode == WS_PONG){
773773
if(datalen != AWSC_PING_PAYLOAD_LEN || memcmp(AWSC_PING_PAYLOAD, data, AWSC_PING_PAYLOAD_LEN) != 0)
774774
_server->_handleEvent(this, WS_EVT_PONG, NULL, data, datalen);

src/AsyncWebSocket.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include "AsyncWebSynchronization.h"
3535

3636
#include <list>
37+
#include <deque>
3738

3839
#ifdef ESP8266
3940
#include <Hash.h>
@@ -163,7 +164,7 @@ class AsyncWebSocketClient {
163164
uint32_t _clientId;
164165
AwsClientStatus _status;
165166

166-
LinkedList<AsyncWebSocketControl *> _controlQueue;
167+
std::deque<AsyncWebSocketControl> _controlQueue;
167168
LinkedList<AsyncWebSocketMessage *> _messageQueue;
168169

169170
uint8_t _pstate;
@@ -173,7 +174,7 @@ class AsyncWebSocketClient {
173174
uint32_t _keepAlivePeriod;
174175

175176
void _queueMessage(AsyncWebSocketMessage *dataMessage);
176-
void _queueControl(AsyncWebSocketControl *controlMessage);
177+
void _queueControl(uint8_t opcode, uint8_t *data=NULL, size_t len=0, bool mask=false);
177178
void _runQueue();
178179
void _clearQueue();
179180

@@ -210,7 +211,7 @@ class AsyncWebSocketClient {
210211
//data packets
211212
void message(AsyncWebSocketMessage *message){ _queueMessage(message); }
212213
bool queueIsFull() const;
213-
size_t queueLen() { return _messageQueue.length() + _controlQueue.length(); }
214+
size_t queueLen() const;
214215

215216
size_t printf(const char *format, ...) __attribute__ ((format (printf, 2, 3)));
216217
#ifndef ESP32

0 commit comments

Comments
 (0)