From 771021995b512b0f7f49db9869c8e407a9f5fb33 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 5 Nov 2013 12:34:56 -0800 Subject: [PATCH 1/2] add helper to ping with inactive socket --- assignment-client/src/Agent.cpp | 7 +------ libraries/shared/src/NodeList.cpp | 14 ++++++++++---- libraries/shared/src/NodeList.h | 1 + libraries/voxels/src/JurisdictionListener.cpp | 10 ++++++---- libraries/voxels/src/VoxelEditPacketSender.cpp | 10 ++-------- 5 files changed, 20 insertions(+), 22 deletions(-) diff --git a/assignment-client/src/Agent.cpp b/assignment-client/src/Agent.cpp index 1a63d2c4d5..206d115c84 100644 --- a/assignment-client/src/Agent.cpp +++ b/assignment-client/src/Agent.cpp @@ -171,18 +171,13 @@ void Agent::run() { usleep(usecToSleep); } - if (audioMixer && audioMixer->getActiveSocket() && scriptedAudioInjector.hasSamplesToInject()) { + if (audioMixer && NodeList::getInstance()->getNodeActiveSocketOrPing(audioMixer) && scriptedAudioInjector.hasSamplesToInject()) { // we have an audio mixer and samples to inject, send those off scriptedAudioInjector.injectAudio(NodeList::getInstance()->getNodeSocket(), audioMixer->getActiveSocket()); // clear out the audio injector so that it doesn't re-send what we just sent scriptedAudioInjector.clear(); } - - if (audioMixer && !audioMixer->getActiveSocket()) { - // don't have an active socket for the audio-mixer, ping it now - NodeList::getInstance()->pingPublicAndLocalSocketsForInactiveNode(audioMixer); - } if (voxelScripter.getVoxelPacketSender()->voxelServersExist()) { // allow the scripter's call back to setup visual data diff --git a/libraries/shared/src/NodeList.cpp b/libraries/shared/src/NodeList.cpp index 3bf6813465..a943d6dde1 100644 --- a/libraries/shared/src/NodeList.cpp +++ b/libraries/shared/src/NodeList.cpp @@ -687,13 +687,10 @@ unsigned NodeList::broadcastToNodes(unsigned char* broadcastData, size_t dataByt for(NodeList::iterator node = begin(); node != end(); node++) { // only send to the NodeTypes we are asked to send to. if (memchr(nodeTypes, node->getType(), numNodeTypes)) { - if (node->getActiveSocket()) { + if (getNodeActiveSocketOrPing(&(*node))) { // we know which socket is good for this node, send there _nodeSocket.send(node->getActiveSocket(), broadcastData, dataBytes); ++n; - } else { - // we don't have an active link to this node, ping it to set that up - pingPublicAndLocalSocketsForInactiveNode(&(*node)); } } } @@ -718,6 +715,15 @@ void NodeList::possiblyPingInactiveNodes() { } } +sockaddr* NodeList::getNodeActiveSocketOrPing(Node* node) { + if (node->getActiveSocket()) { + return node->getActiveSocket(); + } else { + pingPublicAndLocalSocketsForInactiveNode(node); + return NULL; + } +} + void NodeList::activateSocketFromNodeCommunication(sockaddr *nodeAddress) { for(NodeList::iterator node = begin(); node != end(); node++) { if (!node->getActiveSocket()) { diff --git a/libraries/shared/src/NodeList.h b/libraries/shared/src/NodeList.h index c15c37d7bf..47ea2e9e41 100644 --- a/libraries/shared/src/NodeList.h +++ b/libraries/shared/src/NodeList.h @@ -141,6 +141,7 @@ public: void removeDomainListener(DomainChangeListener* listener); void possiblyPingInactiveNodes(); + sockaddr* getNodeActiveSocketOrPing(Node* node); private: static NodeList* _sharedInstance; diff --git a/libraries/voxels/src/JurisdictionListener.cpp b/libraries/voxels/src/JurisdictionListener.cpp index 4cb946620d..7e259ec689 100644 --- a/libraries/voxels/src/JurisdictionListener.cpp +++ b/libraries/voxels/src/JurisdictionListener.cpp @@ -50,10 +50,12 @@ bool JurisdictionListener::queueJurisdictionRequest() { // only send to the NodeTypes that are interested in our jurisdiction details const int numNodeTypes = 1; const NODE_TYPE nodeTypes[numNodeTypes] = { NODE_TYPE_VOXEL_SERVER }; - if (node->getActiveSocket() != NULL && memchr(nodeTypes, node->getType(), numNodeTypes)) { - sockaddr* nodeAddress = node->getActiveSocket(); - PacketSender::queuePacketForSending(*nodeAddress, bufferOut, sizeOut); - nodeCount++; + if (nodeList->getNodeActiveSocketOrPing(&(*node))) { + if (memchr(nodeTypes, node->getType(), numNodeTypes)) { + sockaddr* nodeAddress = node->getActiveSocket(); + PacketSender::queuePacketForSending(*nodeAddress, bufferOut, sizeOut); + nodeCount++; + } } } diff --git a/libraries/voxels/src/VoxelEditPacketSender.cpp b/libraries/voxels/src/VoxelEditPacketSender.cpp index 11e4600f6b..8b7c82a4ca 100644 --- a/libraries/voxels/src/VoxelEditPacketSender.cpp +++ b/libraries/voxels/src/VoxelEditPacketSender.cpp @@ -90,11 +90,8 @@ bool VoxelEditPacketSender::voxelServersExist() const { for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) { // only send to the NodeTypes that are NODE_TYPE_VOXEL_SERVER if (node->getType() == NODE_TYPE_VOXEL_SERVER) { - if (node->getActiveSocket()) { + if (nodeList->getNodeActiveSocketOrPing(&(*node))) { return true; - } else { - // we don't have an active socket for this node, ping it - nodeList->pingPublicAndLocalSocketsForInactiveNode(&(*node)); } } } @@ -109,12 +106,9 @@ void VoxelEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned ch // only send to the NodeTypes that are NODE_TYPE_VOXEL_SERVER if (node->getType() == NODE_TYPE_VOXEL_SERVER && ((node->getUUID() == nodeUUID) || (nodeUUID.isNull()))) { - if (node->getActiveSocket()) { + if (nodeList->getNodeActiveSocketOrPing(&(*node))) { sockaddr* nodeAddress = node->getActiveSocket(); queuePacketForSending(*nodeAddress, buffer, length); - } else { - // we don't have an active socket for this node, ping it - nodeList->pingPublicAndLocalSocketsForInactiveNode(&(*node)); } } } From eef6fd53eb5223b92b98685f21280ba70fde5354 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 5 Nov 2013 12:37:38 -0800 Subject: [PATCH 2/2] cleanup node type check in JL --- libraries/voxels/src/JurisdictionListener.cpp | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/libraries/voxels/src/JurisdictionListener.cpp b/libraries/voxels/src/JurisdictionListener.cpp index 7e259ec689..6871c881df 100644 --- a/libraries/voxels/src/JurisdictionListener.cpp +++ b/libraries/voxels/src/JurisdictionListener.cpp @@ -46,16 +46,10 @@ bool JurisdictionListener::queueJurisdictionRequest() { NodeList* nodeList = NodeList::getInstance(); for (NodeList::iterator node = nodeList->begin(); node != nodeList->end(); node++) { - - // only send to the NodeTypes that are interested in our jurisdiction details - const int numNodeTypes = 1; - const NODE_TYPE nodeTypes[numNodeTypes] = { NODE_TYPE_VOXEL_SERVER }; - if (nodeList->getNodeActiveSocketOrPing(&(*node))) { - if (memchr(nodeTypes, node->getType(), numNodeTypes)) { - sockaddr* nodeAddress = node->getActiveSocket(); - PacketSender::queuePacketForSending(*nodeAddress, bufferOut, sizeOut); - nodeCount++; - } + if (nodeList->getNodeActiveSocketOrPing(&(*node)) && node->getType() == NODE_TYPE_VOXEL_SERVER) { + sockaddr* nodeAddress = node->getActiveSocket(); + PacketSender::queuePacketForSending(*nodeAddress, bufferOut, sizeOut); + nodeCount++; } }