mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 18:50:00 +02:00
Merge pull request #3158 from wangyix/master
worklist 19807: Fixed bug in OctreeEditPacketSender where there was one outgoing seq number for all nodes.
This commit is contained in:
commit
dbca97c71b
2 changed files with 16 additions and 14 deletions
|
@ -34,7 +34,6 @@ OctreeEditPacketSender::OctreeEditPacketSender() :
|
||||||
_maxPendingMessages(DEFAULT_MAX_PENDING_MESSAGES),
|
_maxPendingMessages(DEFAULT_MAX_PENDING_MESSAGES),
|
||||||
_releaseQueuedMessagesPending(false),
|
_releaseQueuedMessagesPending(false),
|
||||||
_serverJurisdictions(NULL),
|
_serverJurisdictions(NULL),
|
||||||
_sequenceNumber(0),
|
|
||||||
_maxPacketSize(MAX_PACKET_SIZE) {
|
_maxPacketSize(MAX_PACKET_SIZE) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,7 +87,7 @@ bool OctreeEditPacketSender::serversExist() const {
|
||||||
|
|
||||||
// This method is called when the edit packet layer has determined that it has a fully formed packet destined for
|
// This method is called when the edit packet layer has determined that it has a fully formed packet destined for
|
||||||
// a known nodeID.
|
// a known nodeID.
|
||||||
void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, const unsigned char* buffer, ssize_t length) {
|
void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned char* buffer, ssize_t length) {
|
||||||
NodeList* nodeList = NodeList::getInstance();
|
NodeList* nodeList = NodeList::getInstance();
|
||||||
|
|
||||||
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
|
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
|
||||||
|
@ -96,13 +95,18 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, const unsi
|
||||||
if (node->getType() == getMyNodeType() &&
|
if (node->getType() == getMyNodeType() &&
|
||||||
((node->getUUID() == nodeUUID) || (nodeUUID.isNull()))) {
|
((node->getUUID() == nodeUUID) || (nodeUUID.isNull()))) {
|
||||||
if (node->getActiveSocket()) {
|
if (node->getActiveSocket()) {
|
||||||
|
|
||||||
|
// pack sequence number
|
||||||
|
int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast<char*>(buffer));
|
||||||
|
unsigned char* sequenceAt = buffer + numBytesPacketHeader;
|
||||||
|
quint16 sequence = _outgoingSequenceNumbers[nodeUUID]++;
|
||||||
|
memcpy(sequenceAt, &sequence, sizeof(quint16));
|
||||||
|
|
||||||
|
// send packet
|
||||||
QByteArray packet(reinterpret_cast<const char*>(buffer), length);
|
QByteArray packet(reinterpret_cast<const char*>(buffer), length);
|
||||||
queuePacketForSending(node, packet);
|
queuePacketForSending(node, packet);
|
||||||
|
|
||||||
// extract sequence number and add packet to history
|
// add packet to history
|
||||||
int numBytesPacketHeader = numBytesForPacketHeader(packet);
|
|
||||||
const char* dataAt = reinterpret_cast<const char*>(packet.data()) + numBytesPacketHeader;
|
|
||||||
unsigned short int sequence = *((unsigned short int*)dataAt);
|
|
||||||
_sentPacketHistories[nodeUUID].packetSent(sequence, packet);
|
_sentPacketHistories[nodeUUID].packetSent(sequence, packet);
|
||||||
|
|
||||||
// debugging output...
|
// debugging output...
|
||||||
|
@ -312,11 +316,8 @@ void OctreeEditPacketSender::releaseQueuedPacket(EditPacketBuffer& packetBuffer)
|
||||||
void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type) {
|
void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type) {
|
||||||
packetBuffer._currentSize = populatePacketHeader(reinterpret_cast<char*>(&packetBuffer._currentBuffer[0]), type);
|
packetBuffer._currentSize = populatePacketHeader(reinterpret_cast<char*>(&packetBuffer._currentBuffer[0]), type);
|
||||||
|
|
||||||
// pack in sequence numbers
|
// skip over sequence number for now; will be packed when packet is ready to be sent out
|
||||||
unsigned short int* sequenceAt = (unsigned short int*)&packetBuffer._currentBuffer[packetBuffer._currentSize];
|
packetBuffer._currentSize += sizeof(quint16);
|
||||||
*sequenceAt = _sequenceNumber;
|
|
||||||
packetBuffer._currentSize += sizeof(unsigned short int); // nudge past sequence
|
|
||||||
_sequenceNumber++;
|
|
||||||
|
|
||||||
// pack in timestamp
|
// pack in timestamp
|
||||||
quint64 now = usecTimestampNow();
|
quint64 now = usecTimestampNow();
|
||||||
|
@ -373,5 +374,6 @@ void OctreeEditPacketSender::nodeKilled(SharedNodePointer node) {
|
||||||
// TODO: add locks
|
// TODO: add locks
|
||||||
QUuid nodeUUID = node->getUUID();
|
QUuid nodeUUID = node->getUUID();
|
||||||
_pendingEditPackets.remove(nodeUUID);
|
_pendingEditPackets.remove(nodeUUID);
|
||||||
|
_outgoingSequenceNumbers.remove(nodeUUID);
|
||||||
_sentPacketHistories.remove(nodeUUID);
|
_sentPacketHistories.remove(nodeUUID);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
/// Used for construction of edit packets
|
/// Used for construction of edit packets
|
||||||
class EditPacketBuffer {
|
class EditPacketBuffer {
|
||||||
public:
|
public:
|
||||||
EditPacketBuffer() : _nodeUUID(), _currentType(PacketTypeUnknown), _currentSize(0) { }
|
EditPacketBuffer() : _nodeUUID(), _currentType(PacketTypeUnknown), _currentSize(0) { }
|
||||||
EditPacketBuffer(PacketType type, unsigned char* codeColorBuffer, ssize_t length, const QUuid nodeUUID = QUuid());
|
EditPacketBuffer(PacketType type, unsigned char* codeColorBuffer, ssize_t length, const QUuid nodeUUID = QUuid());
|
||||||
QUuid _nodeUUID;
|
QUuid _nodeUUID;
|
||||||
PacketType _currentType;
|
PacketType _currentType;
|
||||||
|
@ -100,7 +100,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool _shouldSend;
|
bool _shouldSend;
|
||||||
void queuePacketToNode(const QUuid& nodeID, const unsigned char* buffer, ssize_t length);
|
void queuePacketToNode(const QUuid& nodeID, unsigned char* buffer, ssize_t length);
|
||||||
void queuePendingPacketToNodes(PacketType type, unsigned char* buffer, ssize_t length);
|
void queuePendingPacketToNodes(PacketType type, unsigned char* buffer, ssize_t length);
|
||||||
void queuePacketToNodes(unsigned char* buffer, ssize_t length);
|
void queuePacketToNodes(unsigned char* buffer, ssize_t length);
|
||||||
void initializePacket(EditPacketBuffer& packetBuffer, PacketType type);
|
void initializePacket(EditPacketBuffer& packetBuffer, PacketType type);
|
||||||
|
@ -120,12 +120,12 @@ protected:
|
||||||
|
|
||||||
NodeToJurisdictionMap* _serverJurisdictions;
|
NodeToJurisdictionMap* _serverJurisdictions;
|
||||||
|
|
||||||
unsigned short int _sequenceNumber;
|
|
||||||
int _maxPacketSize;
|
int _maxPacketSize;
|
||||||
|
|
||||||
QMutex _releaseQueuedPacketMutex;
|
QMutex _releaseQueuedPacketMutex;
|
||||||
|
|
||||||
// TODO: add locks for this and _pendingEditPackets
|
// TODO: add locks for this and _pendingEditPackets
|
||||||
QHash<QUuid, SentPacketHistory> _sentPacketHistories;
|
QHash<QUuid, SentPacketHistory> _sentPacketHistories;
|
||||||
|
QHash<QUuid, quint16> _outgoingSequenceNumbers;
|
||||||
};
|
};
|
||||||
#endif // hifi_OctreeEditPacketSender_h
|
#endif // hifi_OctreeEditPacketSender_h
|
||||||
|
|
Loading…
Reference in a new issue