diff --git a/libraries/voxels/src/JurisdictionSender.cpp b/libraries/voxels/src/JurisdictionSender.cpp index 150d04440f..d00d09b9e9 100644 --- a/libraries/voxels/src/JurisdictionSender.cpp +++ b/libraries/voxels/src/JurisdictionSender.cpp @@ -21,16 +21,22 @@ JurisdictionSender::JurisdictionSender(JurisdictionMap* map, PacketSenderNotify* ReceivedPacketProcessor(), _jurisdictionMap(map) { + pthread_mutex_init(&_requestingNodeMutex, 0); } +JurisdictionSender::~JurisdictionSender() { + pthread_mutex_destroy(&_requestingNodeMutex); +} + + void JurisdictionSender::processPacket(sockaddr& senderAddress, unsigned char* packetData, ssize_t packetLength) { if (packetData[0] == PACKET_TYPE_VOXEL_JURISDICTION_REQUEST) { Node* node = NodeList::getInstance()->nodeWithAddress(&senderAddress); if (node) { QUuid nodeUUID = node->getUUID(); - lock(); + lockRequestingNodes(); _nodesRequestingJurisdictions.insert(nodeUUID); - unlock(); + unlockRequestingNodes(); } } } @@ -52,6 +58,7 @@ bool JurisdictionSender::process() { } int nodeCount = 0; + lockRequestingNodes(); for (std::set::iterator nodeIterator = _nodesRequestingJurisdictions.begin(); nodeIterator != _nodesRequestingJurisdictions.end(); nodeIterator++) { @@ -66,6 +73,7 @@ bool JurisdictionSender::process() { _nodesRequestingJurisdictions.erase(nodeIterator); } } + unlockRequestingNodes(); // set our packets per second to be the number of nodes setPacketsPerSecond(nodeCount); diff --git a/libraries/voxels/src/JurisdictionSender.h b/libraries/voxels/src/JurisdictionSender.h index 9678eb15e2..2cf3a6b932 100644 --- a/libraries/voxels/src/JurisdictionSender.h +++ b/libraries/voxels/src/JurisdictionSender.h @@ -25,6 +25,7 @@ public: static const int DEFAULT_PACKETS_PER_SECOND = 1; JurisdictionSender(JurisdictionMap* map, PacketSenderNotify* notify = NULL); + ~JurisdictionSender(); void setJurisdiction(JurisdictionMap* map) { _jurisdictionMap = map; } @@ -33,7 +34,15 @@ public: protected: virtual void processPacket(sockaddr& senderAddress, unsigned char* packetData, ssize_t packetLength); + /// Locks all the resources of the thread. + void lockRequestingNodes() { pthread_mutex_lock(&_requestingNodeMutex); } + + /// Unlocks all the resources of the thread. + void unlockRequestingNodes() { pthread_mutex_unlock(&_requestingNodeMutex); } + + private: + pthread_mutex_t _requestingNodeMutex; JurisdictionMap* _jurisdictionMap; std::set _nodesRequestingJurisdictions; };