diff --git a/interface/src/VoxelHideShowThread.h b/interface/src/VoxelHideShowThread.h index 22df6c299c..2925888022 100644 --- a/interface/src/VoxelHideShowThread.h +++ b/interface/src/VoxelHideShowThread.h @@ -15,7 +15,7 @@ #include "VoxelSystem.h" /// Generalized threaded processor for handling received inbound packets. -class VoxelHideShowThread : public virtual GenericThread { +class VoxelHideShowThread : public GenericThread { public: VoxelHideShowThread(VoxelSystem* theSystem); diff --git a/libraries/octree-server/src/OctreeSendThread.h b/libraries/octree-server/src/OctreeSendThread.h index a2de8fcb5d..c0936371f2 100644 --- a/libraries/octree-server/src/OctreeSendThread.h +++ b/libraries/octree-server/src/OctreeSendThread.h @@ -17,7 +17,7 @@ #include "OctreeServer.h" /// Threaded processor for sending voxel packets to a single client -class OctreeSendThread : public virtual GenericThread { +class OctreeSendThread : public GenericThread { public: OctreeSendThread(const QUuid& nodeUUID, OctreeServer* myServer); diff --git a/libraries/octree/src/JurisdictionListener.cpp b/libraries/octree/src/JurisdictionListener.cpp index d8919ac48e..6ed039f0bd 100644 --- a/libraries/octree/src/JurisdictionListener.cpp +++ b/libraries/octree/src/JurisdictionListener.cpp @@ -16,13 +16,13 @@ #include "JurisdictionListener.h" JurisdictionListener::JurisdictionListener(NODE_TYPE type, PacketSenderNotify* notify) : - PacketSender(notify, JurisdictionListener::DEFAULT_PACKETS_PER_SECOND) + _packetSender(notify, JurisdictionListener::DEFAULT_PACKETS_PER_SECOND) { _nodeType = type; ReceivedPacketProcessor::_dontSleep = true; // we handle sleeping so this class doesn't need to -// connect(nodeList, &NodeList::nodeKilled, this, &JurisdictionListener::nodeKilled); -// qDebug("JurisdictionListener::JurisdictionListener(NODE_TYPE type=%c)\n", type); + connect(NodeList::getInstance(), &NodeList::nodeKilled, this, &JurisdictionListener::nodeKilled); + //qDebug("JurisdictionListener::JurisdictionListener(NODE_TYPE type=%c)", type); } void JurisdictionListener::nodeKilled(SharedNodePointer node) { @@ -32,7 +32,7 @@ void JurisdictionListener::nodeKilled(SharedNodePointer node) { } bool JurisdictionListener::queueJurisdictionRequest() { - //qDebug() << "JurisdictionListener::queueJurisdictionRequest()\n"; + //qDebug() << "JurisdictionListener::queueJurisdictionRequest()"; static unsigned char buffer[MAX_PACKET_SIZE]; unsigned char* bufferOut = &buffer[0]; @@ -45,15 +45,15 @@ bool JurisdictionListener::queueJurisdictionRequest() { if (nodeList->getNodeActiveSocketOrPing(node.data()) && node->getType() == getNodeType()) { const HifiSockAddr* nodeAddress = node->getActiveSocket(); - PacketSender::queuePacketForSending(*nodeAddress, bufferOut, sizeOut); + _packetSender.queuePacketForSending(*nodeAddress, bufferOut, sizeOut); nodeCount++; } } if (nodeCount > 0){ - setPacketsPerSecond(nodeCount); + _packetSender.setPacketsPerSecond(nodeCount); } else { - setPacketsPerSecond(NO_SERVER_CHECK_RATE); + _packetSender.setPacketsPerSecond(NO_SERVER_CHECK_RATE); } // keep going if still running @@ -61,6 +61,7 @@ bool JurisdictionListener::queueJurisdictionRequest() { } void JurisdictionListener::processPacket(const HifiSockAddr& senderAddress, unsigned char* packetData, ssize_t packetLength) { + //qDebug() << "JurisdictionListener::processPacket()"; if (packetData[0] == PACKET_TYPE_JURISDICTION) { SharedNodePointer node = NodeList::getInstance()->nodeWithAddress(senderAddress); if (node) { @@ -73,12 +74,17 @@ void JurisdictionListener::processPacket(const HifiSockAddr& senderAddress, unsi } bool JurisdictionListener::process() { + //qDebug() << "JurisdictionListener::process()"; bool continueProcessing = isStillRunning(); // If we're still running, and we don't have any requests waiting to be sent, then queue our jurisdiction requests - if (continueProcessing && !hasPacketsToSend()) { + if (continueProcessing && !_packetSender.hasPacketsToSend()) { queueJurisdictionRequest(); - continueProcessing = PacketSender::process(); + } + + if (continueProcessing) { + //qDebug() << "JurisdictionListener::process() calling _packetSender.process()"; + continueProcessing = _packetSender.process(); } if (continueProcessing) { // NOTE: This will sleep if there are no pending packets to process diff --git a/libraries/octree/src/JurisdictionListener.h b/libraries/octree/src/JurisdictionListener.h index 393ca80420..c112f43b52 100644 --- a/libraries/octree/src/JurisdictionListener.h +++ b/libraries/octree/src/JurisdictionListener.h @@ -22,7 +22,7 @@ /// the PACKET_TYPE_JURISDICTION packets it receives in order to maintain an accurate state of all jurisidictions /// within the domain. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets /// and adding them to the processing queue by calling queueReceivedPacket() -class JurisdictionListener : public PacketSender, public ReceivedPacketProcessor { +class JurisdictionListener : public ReceivedPacketProcessor { public: static const int DEFAULT_PACKETS_PER_SECOND = 1; static const int NO_SERVER_CHECK_RATE = 60; // if no servers yet detected, keep checking at 60fps @@ -55,5 +55,7 @@ private: NODE_TYPE _nodeType; bool queueJurisdictionRequest(); + + PacketSender _packetSender; }; #endif // __shared__JurisdictionListener__ diff --git a/libraries/octree/src/JurisdictionMap.cpp b/libraries/octree/src/JurisdictionMap.cpp index 53cc955553..bf64e19959 100644 --- a/libraries/octree/src/JurisdictionMap.cpp +++ b/libraries/octree/src/JurisdictionMap.cpp @@ -331,16 +331,20 @@ int JurisdictionMap::unpackFromMessage(unsigned char* sourceBuffer, int availabl // increment to push past the packet header int numBytesPacketHeader = numBytesForPacketHeader(sourceBuffer); sourceBuffer += numBytesPacketHeader; + int remainingBytes = availableBytes - numBytesPacketHeader; // read the root jurisdiction int bytes = 0; memcpy(&bytes, sourceBuffer, sizeof(bytes)); sourceBuffer += sizeof(bytes); + remainingBytes -= sizeof(bytes); - if (bytes > 0) { + if (bytes > 0 && bytes <= remainingBytes) { _rootOctalCode = new unsigned char[bytes]; memcpy(_rootOctalCode, sourceBuffer, bytes); sourceBuffer += bytes; + remainingBytes -= bytes; + // if and only if there's a root jurisdiction, also include the end nodes int endNodeCount = 0; memcpy(&endNodeCount, sourceBuffer, sizeof(endNodeCount)); @@ -349,13 +353,18 @@ int JurisdictionMap::unpackFromMessage(unsigned char* sourceBuffer, int availabl int bytes = 0; memcpy(&bytes, sourceBuffer, sizeof(bytes)); sourceBuffer += sizeof(bytes); - unsigned char* endNodeCode = new unsigned char[bytes]; - memcpy(endNodeCode, sourceBuffer, bytes); - sourceBuffer += bytes; + remainingBytes -= sizeof(bytes); - // if the endNodeCode was 0 length then don't add it - if (bytes > 0) { - _endNodes.push_back(endNodeCode); + if (bytes <= remainingBytes) { + unsigned char* endNodeCode = new unsigned char[bytes]; + memcpy(endNodeCode, sourceBuffer, bytes); + sourceBuffer += bytes; + remainingBytes -= bytes; + + // if the endNodeCode was 0 length then don't add it + if (bytes > 0) { + _endNodes.push_back(endNodeCode); + } } } } diff --git a/libraries/octree/src/JurisdictionSender.cpp b/libraries/octree/src/JurisdictionSender.cpp index ab31f9356b..521dbdb7e4 100644 --- a/libraries/octree/src/JurisdictionSender.cpp +++ b/libraries/octree/src/JurisdictionSender.cpp @@ -17,9 +17,9 @@ JurisdictionSender::JurisdictionSender(JurisdictionMap* map, NODE_TYPE type, PacketSenderNotify* notify) : - PacketSender(notify, JurisdictionSender::DEFAULT_PACKETS_PER_SECOND), ReceivedPacketProcessor(), - _jurisdictionMap(map) + _jurisdictionMap(map), + _packetSender(notify, JurisdictionSender::DEFAULT_PACKETS_PER_SECOND) { _nodeType = type; } @@ -66,16 +66,16 @@ bool JurisdictionSender::process() { if (node->getActiveSocket() != NULL) { const HifiSockAddr* nodeAddress = node->getActiveSocket(); - queuePacketForSending(*nodeAddress, bufferOut, sizeOut); + _packetSender.queuePacketForSending(*nodeAddress, bufferOut, sizeOut); nodeCount++; } } unlockRequestingNodes(); // set our packets per second to be the number of nodes - setPacketsPerSecond(nodeCount); + _packetSender.setPacketsPerSecond(nodeCount); - continueProcessing = PacketSender::process(); + continueProcessing = _packetSender.process(); } return continueProcessing; } diff --git a/libraries/octree/src/JurisdictionSender.h b/libraries/octree/src/JurisdictionSender.h index 441bb5ee1e..287a5dbf61 100644 --- a/libraries/octree/src/JurisdictionSender.h +++ b/libraries/octree/src/JurisdictionSender.h @@ -21,7 +21,7 @@ /// Will process PACKET_TYPE_JURISDICTION_REQUEST packets and send out PACKET_TYPE_JURISDICTION packets /// to requesting parties. As with other ReceivedPacketProcessor classes the user is responsible for reading inbound packets /// and adding them to the processing queue by calling queueReceivedPacket() -class JurisdictionSender : public PacketSender, public ReceivedPacketProcessor { +class JurisdictionSender : public ReceivedPacketProcessor { Q_OBJECT public: static const int DEFAULT_PACKETS_PER_SECOND = 1; @@ -51,5 +51,7 @@ private: JurisdictionMap* _jurisdictionMap; std::queue _nodesRequestingJurisdictions; NODE_TYPE _nodeType; + + PacketSender _packetSender; }; #endif // __shared__JurisdictionSender__ diff --git a/libraries/octree/src/OctreeScriptingInterface.cpp b/libraries/octree/src/OctreeScriptingInterface.cpp index d72f2e7443..7355b8e2de 100644 --- a/libraries/octree/src/OctreeScriptingInterface.cpp +++ b/libraries/octree/src/OctreeScriptingInterface.cpp @@ -46,7 +46,7 @@ void OctreeScriptingInterface::init() { } else { _managedJurisdictionListener = true; _jurisdictionListener = new JurisdictionListener(getServerNodeType()); - //printf("OctreeScriptingInterface::init() _managedJurisdictionListener=true, creating _jurisdictionListener=%p\n", _jurisdictionListener); + //qDebug("OctreeScriptingInterface::init() _managedJurisdictionListener=true, creating _jurisdictionListener=%p", _jurisdictionListener); _jurisdictionListener->initialize(true); } @@ -55,7 +55,7 @@ void OctreeScriptingInterface::init() { } else { _managedPacketSender = true; _packetSender = createPacketSender(); - //printf("OctreeScriptingInterface::init() _managedPacketSender=true, creating _packetSender=%p\n", _packetSender); + //qDebug("OctreeScriptingInterface::init() _managedPacketSender=true, creating _packetSender=%p", _packetSender); _packetSender->setServerJurisdictions(_jurisdictionListener->getJurisdictions()); } } diff --git a/libraries/particles/src/ParticlesScriptingInterface.h b/libraries/particles/src/ParticlesScriptingInterface.h index edd2ac43dc..d61f8289f4 100644 --- a/libraries/particles/src/ParticlesScriptingInterface.h +++ b/libraries/particles/src/ParticlesScriptingInterface.h @@ -11,7 +11,6 @@ #include -#include #include #include "ParticleEditPacketSender.h" diff --git a/libraries/shared/src/PacketSender.h b/libraries/shared/src/PacketSender.h index 9005a2b254..7a2c6e6d2a 100644 --- a/libraries/shared/src/PacketSender.h +++ b/libraries/shared/src/PacketSender.h @@ -23,7 +23,7 @@ public: /// Generalized threaded processor for queueing and sending of outbound packets. -class PacketSender : public virtual GenericThread { +class PacketSender : public GenericThread { public: static const uint64_t USECS_PER_SECOND; diff --git a/libraries/shared/src/ReceivedPacketProcessor.h b/libraries/shared/src/ReceivedPacketProcessor.h index 621204025e..567434a49e 100644 --- a/libraries/shared/src/ReceivedPacketProcessor.h +++ b/libraries/shared/src/ReceivedPacketProcessor.h @@ -15,7 +15,7 @@ #include "NetworkPacket.h" /// Generalized threaded processor for handling received inbound packets. -class ReceivedPacketProcessor : public virtual GenericThread { +class ReceivedPacketProcessor : public GenericThread { public: ReceivedPacketProcessor(); diff --git a/libraries/voxels/src/VoxelsScriptingInterface.h b/libraries/voxels/src/VoxelsScriptingInterface.h index 6bbe21d601..a1f52fc1c3 100644 --- a/libraries/voxels/src/VoxelsScriptingInterface.h +++ b/libraries/voxels/src/VoxelsScriptingInterface.h @@ -11,7 +11,6 @@ #include -#include #include #include "VoxelConstants.h"