mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 03:17:02 +02:00
Merge pull request #8859 from Atlante45/seq-num-race
Fix sequence number race condition
This commit is contained in:
commit
6109f41ae2
2 changed files with 15 additions and 2 deletions
|
@ -118,8 +118,14 @@ qint64 Socket::writeBasePacket(const udt::BasePacket& packet, const HifiSockAddr
|
||||||
qint64 Socket::writePacket(const Packet& packet, const HifiSockAddr& sockAddr) {
|
qint64 Socket::writePacket(const Packet& packet, const HifiSockAddr& sockAddr) {
|
||||||
Q_ASSERT_X(!packet.isReliable(), "Socket::writePacket", "Cannot send a reliable packet unreliably");
|
Q_ASSERT_X(!packet.isReliable(), "Socket::writePacket", "Cannot send a reliable packet unreliably");
|
||||||
|
|
||||||
|
SequenceNumber sequenceNumber;
|
||||||
|
{
|
||||||
|
Lock lock(_unreliableSequenceNumbersMutex);
|
||||||
|
sequenceNumber = ++_unreliableSequenceNumbers[sockAddr];
|
||||||
|
}
|
||||||
|
|
||||||
// write the correct sequence number to the Packet here
|
// write the correct sequence number to the Packet here
|
||||||
packet.writeSequenceNumber(++_unreliableSequenceNumbers[sockAddr]);
|
packet.writeSequenceNumber(sequenceNumber);
|
||||||
|
|
||||||
return writeDatagram(packet.getData(), packet.getDataSize(), sockAddr);
|
return writeDatagram(packet.getData(), packet.getDataSize(), sockAddr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
#include <QtCore/QObject>
|
#include <QtCore/QObject>
|
||||||
#include <QtCore/QTimer>
|
#include <QtCore/QTimer>
|
||||||
|
@ -46,6 +47,10 @@ using MessageFailureHandler = std::function<void(HifiSockAddr, udt::Packet::Mess
|
||||||
|
|
||||||
class Socket : public QObject {
|
class Socket : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
using Mutex = std::mutex;
|
||||||
|
using Lock = std::unique_lock<Mutex>;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
using StatsVector = std::vector<std::pair<HifiSockAddr, ConnectionStats::Stats>>;
|
using StatsVector = std::vector<std::pair<HifiSockAddr, ConnectionStats::Stats>>;
|
||||||
|
|
||||||
|
@ -121,7 +126,9 @@ private:
|
||||||
MessageHandler _messageHandler;
|
MessageHandler _messageHandler;
|
||||||
MessageFailureHandler _messageFailureHandler;
|
MessageFailureHandler _messageFailureHandler;
|
||||||
ConnectionCreationFilterOperator _connectionCreationFilterOperator;
|
ConnectionCreationFilterOperator _connectionCreationFilterOperator;
|
||||||
|
|
||||||
|
Mutex _unreliableSequenceNumbersMutex;
|
||||||
|
|
||||||
std::unordered_map<HifiSockAddr, BasePacketHandler> _unfilteredHandlers;
|
std::unordered_map<HifiSockAddr, BasePacketHandler> _unfilteredHandlers;
|
||||||
std::unordered_map<HifiSockAddr, SequenceNumber> _unreliableSequenceNumbers;
|
std::unordered_map<HifiSockAddr, SequenceNumber> _unreliableSequenceNumbers;
|
||||||
std::unordered_map<HifiSockAddr, std::unique_ptr<Connection>> _connectionsHash;
|
std::unordered_map<HifiSockAddr, std::unique_ptr<Connection>> _connectionsHash;
|
||||||
|
|
Loading…
Reference in a new issue