Commit 54f45b2729fb0896ee558622a03504e2149bfb5d
1 parent
e29e0f6d
Rudimentary lock based cross-thread publish
Showing
2 changed files
with
10 additions
and
1 deletions
client.cpp
| ... | ... | @@ -77,6 +77,8 @@ bool Client::readFdIntoBuffer() |
| 77 | 77 | |
| 78 | 78 | void Client::writeMqttPacket(const MqttPacket &packet) |
| 79 | 79 | { |
| 80 | + std::lock_guard<std::mutex> locker(writeBufMutex); | |
| 81 | + | |
| 80 | 82 | if (packet.packetType == PacketType::PUBLISH && wwi > CLIENT_MAX_BUFFER_SIZE) |
| 81 | 83 | return; |
| 82 | 84 | |
| ... | ... | @@ -99,6 +101,8 @@ void Client::writeMqttPacketLocked(const MqttPacket &packet) |
| 99 | 101 | // Ping responses are always the same, so hardcoding it for optimization. |
| 100 | 102 | void Client::writePingResp() |
| 101 | 103 | { |
| 104 | + std::lock_guard<std::mutex> locker(writeBufMutex); | |
| 105 | + | |
| 102 | 106 | std::cout << "Sending ping response to " << repr() << std::endl; |
| 103 | 107 | |
| 104 | 108 | if (2 > getWriteBufMaxWriteSize()) |
| ... | ... | @@ -112,6 +116,8 @@ void Client::writePingResp() |
| 112 | 116 | |
| 113 | 117 | bool Client::writeBufIntoFd() |
| 114 | 118 | { |
| 119 | + std::lock_guard<std::mutex> locker(writeBufMutex); | |
| 120 | + | |
| 115 | 121 | int n; |
| 116 | 122 | while ((n = write(fd, &writebuf[wri], getWriteBufBytesUsed())) != 0) |
| 117 | 123 | { | ... | ... |
subscriptionstore.cpp
| ... | ... | @@ -28,6 +28,9 @@ void SubscriptionStore::queueAtClientsTemp(std::string &topic, const MqttPacket |
| 28 | 28 | |
| 29 | 29 | for(const Client_p &client : subscriptions[topic]) |
| 30 | 30 | { |
| 31 | + client->writeMqttPacket(packet); | |
| 32 | + | |
| 33 | + /* | |
| 31 | 34 | if (client->getThreadData()->threadnr == sender->getThreadData()->threadnr) |
| 32 | 35 | { |
| 33 | 36 | client->writeMqttPacket(packet); // TODO: with my current hack way, this is wrong. Not using a lock only works with my previous idea of queueing. |
| ... | ... | @@ -39,6 +42,6 @@ void SubscriptionStore::queueAtClientsTemp(std::string &topic, const MqttPacket |
| 39 | 42 | //client->writeMqttPacketLocked(packet); |
| 40 | 43 | //client->getThreadData()->addToReadyForDequeuing(client); |
| 41 | 44 | //client->getThreadData()->wakeUpThread(); |
| 42 | - } | |
| 45 | + }*/ | |
| 43 | 46 | } |
| 44 | 47 | } | ... | ... |