From c3914e648f56c4a73465b56daa8a3f91f426383c Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 6 Nov 2013 13:52:31 -0800 Subject: [PATCH] lock our node while using it to prevent crash on domain shutdown --- .../src/VoxelSendThread.cpp | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/libraries/voxel-server-library/src/VoxelSendThread.cpp b/libraries/voxel-server-library/src/VoxelSendThread.cpp index 1a7762825c..18f0485983 100644 --- a/libraries/voxel-server-library/src/VoxelSendThread.cpp +++ b/libraries/voxel-server-library/src/VoxelSendThread.cpp @@ -27,27 +27,31 @@ bool VoxelSendThread::process() { uint64_t start = usecTimestampNow(); Node* node = NodeList::getInstance()->nodeWithUUID(_nodeUUID); - VoxelNodeData* nodeData = NULL; if (node) { - nodeData = (VoxelNodeData*) node->getLinkedData(); - } + node->lock(); // make sure the node list doesn't kill our node while we're using it + VoxelNodeData* nodeData = NULL; - int packetsSent = 0; + nodeData = (VoxelNodeData*) node->getLinkedData(); + + int packetsSent = 0; - // Sometimes the node data has not yet been linked, in which case we can't really do anything - if (nodeData) { - bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); - if (_myServer->wantsDebugVoxelSending()) { - printf("nodeData->updateCurrentViewFrustum() changed=%s\n", debug::valueOf(viewFrustumChanged)); + // Sometimes the node data has not yet been linked, in which case we can't really do anything + if (nodeData) { + bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); + if (_myServer->wantsDebugVoxelSending()) { + printf("nodeData->updateCurrentViewFrustum() changed=%s\n", debug::valueOf(viewFrustumChanged)); + } + packetsSent = deepestLevelVoxelDistributor(node, nodeData, viewFrustumChanged); } - packetsSent = deepestLevelVoxelDistributor(node, nodeData, viewFrustumChanged); + + node->unlock(); // we're done with this node for now. } // dynamically sleep until we need to fire off the next set of voxels int elapsed = (usecTimestampNow() - start); int usecToSleep = VOXEL_SEND_INTERVAL_USECS - elapsed; - + if (usecToSleep > 0) { usleep(usecToSleep); } else { @@ -55,6 +59,7 @@ bool VoxelSendThread::process() { std::cout << "Last send took too much time, not sleeping!\n"; } } + return isStillRunning(); // keep running till they terminate us }