From 25e21f862c6fe3b32fd1f4b60917bf2d7d32e57a Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 21 Aug 2013 16:23:55 -0700 Subject: [PATCH] flush delete queue after encode is complete --- libraries/voxels/src/VoxelTree.cpp | 13 +++++++++++++ libraries/voxels/src/VoxelTree.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/libraries/voxels/src/VoxelTree.cpp b/libraries/voxels/src/VoxelTree.cpp index 3e04686843..bd22446c17 100644 --- a/libraries/voxels/src/VoxelTree.cpp +++ b/libraries/voxels/src/VoxelTree.cpp @@ -1832,6 +1832,9 @@ void VoxelTree::doneEncoding(VoxelNode* node) { pthread_mutex_lock(&_encodeSetLock); _codesBeingEncoded.erase(node->getOctalCode()); pthread_mutex_unlock(&_encodeSetLock); + + // if we have any pending delete codes, then delete them now. + emptyDeleteQueue(); } void VoxelTree::startDeleting(unsigned char* code) { @@ -1859,6 +1862,16 @@ void VoxelTree::queueForLaterDelete(unsigned char* codeBuffer) { pthread_mutex_unlock(&_deletePendingSetLock); } +void VoxelTree::emptyDeleteQueue() { + pthread_mutex_lock(&_deletePendingSetLock); + for (std::set::iterator i = _codesPendingDelete.begin(); i != _codesPendingDelete.end(); ++i) { + unsigned char* codeToDelete = *i; + _codesBeingDeleted.erase(codeToDelete); + deleteVoxelCodeFromTree(codeToDelete, COLLAPSE_EMPTY_TREE); + } + pthread_mutex_unlock(&_deletePendingSetLock); +} + void VoxelTree::cancelImport() { _stopImport = true; } diff --git a/libraries/voxels/src/VoxelTree.h b/libraries/voxels/src/VoxelTree.h index 5c6add5230..4128ba6cbd 100644 --- a/libraries/voxels/src/VoxelTree.h +++ b/libraries/voxels/src/VoxelTree.h @@ -252,6 +252,8 @@ private: /// Adds an Octal Code to the set of codes that needs to be deleted void queueForLaterDelete(unsigned char* codeBuffer); + /// flushes out any Octal Codes that had to be queued + void emptyDeleteQueue(); }; float boundaryDistanceForRenderLevel(unsigned int renderLevel);