diff --git a/threadloop.cpp b/threadloop.cpp index a790578..371e939 100644 --- a/threadloop.cpp +++ b/threadloop.cpp @@ -102,6 +102,7 @@ void do_thread_work(ThreadData *threadData) } if ((cur_ev.events & EPOLLIN) || ((cur_ev.events & EPOLLOUT) && client->getSslReadWantsWrite())) { + VectorClearGuard vectorClear(packetQueueIn); bool readSuccess = client->readFdIntoBuffer(); client->bufferToMqttPackets(packetQueueIn, client); @@ -111,6 +112,11 @@ void do_thread_work(ThreadData *threadData) threadData->removeClient(client); continue; } + + for (MqttPacket &packet : packetQueueIn) + { + packet.handle(); + } } if ((cur_ev.events & EPOLLOUT) || ((cur_ev.events & EPOLLIN) && client->getSslWriteWantsRead())) { @@ -136,21 +142,6 @@ void do_thread_work(ThreadData *threadData) } } } - - for (MqttPacket &packet : packetQueueIn) - { - try - { - packet.handle(); - } - catch (std::exception &ex) - { - packet.getSender()->setDisconnectReason(ex.what()); - logger->logf(LOG_ERR, "MqttPacket handling error: %s. Removing client.", ex.what()); - threadData->removeClient(packet.getSender()); - } - } - packetQueueIn.clear(); } try diff --git a/threadloop.h b/threadloop.h index 2262144..6877a5c 100644 --- a/threadloop.h +++ b/threadloop.h @@ -23,6 +23,24 @@ License along with FlashMQ. If not, see . #define MAX_EVENTS 65536 +#include "forward_declarations.h" + +class VectorClearGuard +{ + std::vector &v; +public: + VectorClearGuard(std::vector &v) : + v(v) + { + + } + + ~VectorClearGuard() + { + v.clear(); + } +}; + void do_thread_work(ThreadData *threadData);