From 4da70cf3c88c65c24eb6ee4f58e854fb0e1147b0 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 15 Nov 2013 16:45:03 -0800 Subject: [PATCH] fix to crash on deleteNotify --- libraries/voxels/src/VoxelNode.cpp | 9 ++++++++- libraries/voxels/src/VoxelNode.h | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/libraries/voxels/src/VoxelNode.cpp b/libraries/voxels/src/VoxelNode.cpp index d10b02b193..609d11c1e9 100644 --- a/libraries/voxels/src/VoxelNode.cpp +++ b/libraries/voxels/src/VoxelNode.cpp @@ -1413,25 +1413,32 @@ float VoxelNode::distanceToPoint(const glm::vec3& point) const { return distance; } +QReadWriteLock VoxelNode::_deleteHooksLock; std::vector VoxelNode::_deleteHooks; void VoxelNode::addDeleteHook(VoxelNodeDeleteHook* hook) { + _deleteHooksLock.lockForWrite(); _deleteHooks.push_back(hook); + _deleteHooksLock.unlock(); } void VoxelNode::removeDeleteHook(VoxelNodeDeleteHook* hook) { + _deleteHooksLock.lockForWrite(); for (int i = 0; i < _deleteHooks.size(); i++) { if (_deleteHooks[i] == hook) { _deleteHooks.erase(_deleteHooks.begin() + i); - return; + break; } } + _deleteHooksLock.unlock(); } void VoxelNode::notifyDeleteHooks() { + _deleteHooksLock.lockForRead(); for (int i = 0; i < _deleteHooks.size(); i++) { _deleteHooks[i]->voxelDeleted(this); } + _deleteHooksLock.unlock(); } std::vector VoxelNode::_updateHooks; diff --git a/libraries/voxels/src/VoxelNode.h b/libraries/voxels/src/VoxelNode.h index 53af7ab602..3e10a2fc7b 100644 --- a/libraries/voxels/src/VoxelNode.h +++ b/libraries/voxels/src/VoxelNode.h @@ -13,6 +13,8 @@ //#define SIMPLE_CHILD_ARRAY #define SIMPLE_EXTERNAL_CHILDREN +#include + #include #include "AABox.h" #include "ViewFrustum.h" @@ -239,7 +241,10 @@ private: _unknownBufferIndex : 1, _childrenExternal : 1; /// Client only, is this voxel's VBO buffer the unknown buffer index, 1 bit + static QReadWriteLock _deleteHooksLock; static std::vector _deleteHooks; + + //static QReadWriteLock _updateHooksLock; static std::vector _updateHooks; static uint64_t _voxelNodeCount;