From f5e439c8f86609c3be855b76844352322e366b80 Mon Sep 17 00:00:00 2001 From: 0xFEEDC0DE64 Date: Sat, 19 Dec 2020 23:26:51 +0100 Subject: [PATCH] _controlQueue is now a std::queue --- src/AsyncWebSocket.cpp | 49 ++++++++++++++++++------------------------ src/AsyncWebSocket.h | 11 +++++----- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/src/AsyncWebSocket.cpp b/src/AsyncWebSocket.cpp index 3284d6e..280702a 100644 --- a/src/AsyncWebSocket.cpp +++ b/src/AsyncWebSocket.cpp @@ -475,8 +475,7 @@ AsyncWebSocketMultiMessage::~AsyncWebSocketMultiMessage() { const size_t AWSC_PING_PAYLOAD_LEN = 22; AsyncWebSocketClient::AsyncWebSocketClient(AsyncWebServerRequest *request, AsyncWebSocket *server) - : _controlQueue(LinkedList([](AsyncWebSocketControl *c){ delete c; })) - , _messageQueue(LinkedList([](AsyncWebSocketMessage *m){ delete m; })) + : _messageQueue(LinkedList([](AsyncWebSocketMessage *m){ delete m; })) , _tempObject(NULL) { _client = request->client(); @@ -500,23 +499,23 @@ AsyncWebSocketClient::AsyncWebSocketClient(AsyncWebServerRequest *request, Async AsyncWebSocketClient::~AsyncWebSocketClient(){ _messageQueue.free(); - _controlQueue.free(); + _controlQueue = {}; _server->_handleEvent(this, WS_EVT_DISCONNECT, NULL, NULL, 0); } void AsyncWebSocketClient::_onAck(size_t len, uint32_t time){ _lastMessageTime = millis(); - if(!_controlQueue.isEmpty()){ - auto head = _controlQueue.front(); - if(head->finished()){ - len -= head->len(); - if(_status == WS_DISCONNECTING && head->opcode() == WS_DISCONNECT){ - _controlQueue.remove(head); + if (!_controlQueue.empty()){ + auto &head = _controlQueue.front(); + if (head.finished()){ + len -= head.len(); + if (_status == WS_DISCONNECTING && head.opcode() == WS_DISCONNECT){ + _controlQueue.pop(); _status = WS_DISCONNECTED; _client->close(true); return; } - _controlQueue.remove(head); + _controlQueue.pop(); } } if(len && !_messageQueue.isEmpty()){ @@ -527,9 +526,9 @@ void AsyncWebSocketClient::_onAck(size_t len, uint32_t time){ } void AsyncWebSocketClient::_onPoll(){ - if(_client->canSend() && (!_controlQueue.isEmpty() || !_messageQueue.isEmpty())){ + if(_client->canSend() && (!_controlQueue.empty() || !_messageQueue.isEmpty())){ _runQueue(); - } else if(_keepAlivePeriod > 0 && _controlQueue.isEmpty() && _messageQueue.isEmpty() && (millis() - _lastMessageTime) >= _keepAlivePeriod){ + } else if(_keepAlivePeriod > 0 && _controlQueue.empty() && _messageQueue.isEmpty() && (millis() - _lastMessageTime) >= _keepAlivePeriod){ ping((uint8_t *)AWSC_PING_PAYLOAD, AWSC_PING_PAYLOAD_LEN); } } @@ -539,8 +538,8 @@ void AsyncWebSocketClient::_runQueue(){ _messageQueue.remove(_messageQueue.front()); } - if(!_controlQueue.isEmpty() && (_messageQueue.isEmpty() || _messageQueue.front()->betweenFrames()) && webSocketSendFrameWindow(_client) > (size_t)(_controlQueue.front()->len() - 1)){ - _controlQueue.front()->send(_client); + if(!_controlQueue.empty() && (_messageQueue.isEmpty() || _messageQueue.front()->betweenFrames()) && webSocketSendFrameWindow(_client) > (size_t)(_controlQueue.front().len() - 1)){ + _controlQueue.front().send(_client); } else if(!_messageQueue.isEmpty() && _messageQueue.front()->betweenFrames() && webSocketSendFrameWindow(_client)){ _messageQueue.front()->send(_client); } @@ -567,11 +566,9 @@ void AsyncWebSocketClient::_queueMessage(AsyncWebSocketMessage *dataMessage){ _runQueue(); } -void AsyncWebSocketClient::_queueControl(AsyncWebSocketControl *controlMessage){ - if(controlMessage == NULL) - return; - _controlQueue.add(controlMessage); - if(_client->canSend()) +void AsyncWebSocketClient::_queueControl(uint8_t opcode, uint8_t *data, size_t len, bool mask){ + _controlQueue.emplace(opcode, data, len, mask); + if (_client->canSend()) _runQueue(); } @@ -592,17 +589,17 @@ void AsyncWebSocketClient::close(uint16_t code, const char * message){ if(message != NULL){ memcpy(buf+2, message, packetLen -2); } - _queueControl(new AsyncWebSocketControl(WS_DISCONNECT,(uint8_t*)buf,packetLen)); + _queueControl(WS_DISCONNECT, (uint8_t*)buf, packetLen); free(buf); return; } } - _queueControl(new AsyncWebSocketControl(WS_DISCONNECT)); + _queueControl(WS_DISCONNECT); } void AsyncWebSocketClient::ping(uint8_t *data, size_t len){ if(_status == WS_CONNECTED) - _queueControl(new AsyncWebSocketControl(WS_PING, data, len)); + _queueControl(WS_PING, data, len); } void AsyncWebSocketClient::_onError(int8_t){} @@ -683,10 +680,10 @@ void AsyncWebSocketClient::_onData(void *pbuf, size_t plen){ } else { _status = WS_DISCONNECTING; _client->ackLater(); - _queueControl(new AsyncWebSocketControl(WS_DISCONNECT, data, datalen)); + _queueControl(WS_DISCONNECT, data, datalen); } } else if(_pinfo.opcode == WS_PING){ - _queueControl(new AsyncWebSocketControl(WS_PONG, data, datalen)); + _queueControl(WS_PONG, data, datalen); } else if(_pinfo.opcode == WS_PONG){ if(datalen != AWSC_PING_PAYLOAD_LEN || memcmp(AWSC_PING_PAYLOAD, data, AWSC_PING_PAYLOAD_LEN) != 0) _server->_handleEvent(this, WS_EVT_PONG, NULL, data, datalen); @@ -1243,10 +1240,6 @@ void AsyncWebSocket::_cleanBuffers() } } -const AsyncWebSocket::AsyncWebSocketClientLinkedList &AsyncWebSocket::getClients() const { - return _clients; -} - /* * Response to Web Socket request - sends the authorization and detaches the TCP Client from the web server * Authentication code from https://github.com/Links2004/arduinoWebSockets/blob/master/src/WebSockets.cpp#L480 diff --git a/src/AsyncWebSocket.h b/src/AsyncWebSocket.h index 79f49f5..d67f8bb 100644 --- a/src/AsyncWebSocket.h +++ b/src/AsyncWebSocket.h @@ -34,6 +34,7 @@ #include "AsyncWebSynchronization.h" #include +#include #ifdef ESP8266 #include @@ -163,7 +164,7 @@ class AsyncWebSocketClient { uint32_t _clientId; AwsClientStatus _status; - LinkedList _controlQueue; + std::queue _controlQueue; LinkedList _messageQueue; uint8_t _pstate; @@ -173,7 +174,7 @@ class AsyncWebSocketClient { uint32_t _keepAlivePeriod; void _queueMessage(AsyncWebSocketMessage *dataMessage); - void _queueControl(AsyncWebSocketControl *controlMessage); + void _queueControl(uint8_t opcode, uint8_t *data=NULL, size_t len=0, bool mask=false); void _runQueue(); public: @@ -245,11 +246,9 @@ typedef std::function AsyncWebSocketClientLinkedList; private: String _url; - AsyncWebSocketClientLinkedList _clients; + std::list _clients; uint32_t _cNextId; AwsEventHandler _eventHandler; bool _enabled; @@ -336,7 +335,7 @@ class AsyncWebSocket: public AsyncWebHandler { std::list _buffers; void _cleanBuffers(); - const AsyncWebSocketClientLinkedList &getClients() const; + const auto &getClients() const { return _clients; } }; //WebServer response to authenticate the socket and detach the tcp client from the web server request