From 4ea8e7de5d29ed1747540c6058f2ee5bad63db43 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 23 Jul 2014 11:45:20 -0700 Subject: [PATCH] Atomics for better thread safety. --- libraries/metavoxels/src/MetavoxelData.cpp | 2 +- libraries/metavoxels/src/MetavoxelData.h | 4 ++-- libraries/metavoxels/src/SharedObject.cpp | 4 ++-- libraries/metavoxels/src/SharedObject.h | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/metavoxels/src/MetavoxelData.cpp b/libraries/metavoxels/src/MetavoxelData.cpp index 112012e37f..0f8773a896 100644 --- a/libraries/metavoxels/src/MetavoxelData.cpp +++ b/libraries/metavoxels/src/MetavoxelData.cpp @@ -1117,7 +1117,7 @@ void MetavoxelNode::writeSpannerSubdivision(MetavoxelStreamState& state) const { } void MetavoxelNode::decrementReferenceCount(const AttributePointer& attribute) { - if (--_referenceCount == 0) { + if (!_referenceCount.deref()) { destroy(attribute); delete this; } diff --git a/libraries/metavoxels/src/MetavoxelData.h b/libraries/metavoxels/src/MetavoxelData.h index 1944090a38..dfebbe4586 100644 --- a/libraries/metavoxels/src/MetavoxelData.h +++ b/libraries/metavoxels/src/MetavoxelData.h @@ -212,7 +212,7 @@ public: void writeSpannerSubdivision(MetavoxelStreamState& state) const; /// Increments the node's reference count. - void incrementReferenceCount() { _referenceCount++; } + void incrementReferenceCount() { _referenceCount.ref(); } /// Decrements the node's reference count. If the resulting reference count is zero, destroys the node /// and calls delete this. @@ -238,7 +238,7 @@ private: friend class MetavoxelVisitation; - int _referenceCount; + QAtomicInt _referenceCount; void* _attributeValue; MetavoxelNode* _children[CHILD_COUNT]; }; diff --git a/libraries/metavoxels/src/SharedObject.cpp b/libraries/metavoxels/src/SharedObject.cpp index efc6aa4be6..053ef57bad 100644 --- a/libraries/metavoxels/src/SharedObject.cpp +++ b/libraries/metavoxels/src/SharedObject.cpp @@ -23,7 +23,7 @@ REGISTER_META_OBJECT(SharedObject) SharedObject::SharedObject() : - _id(++_lastID), + _id(_nextID.fetchAndAddOrdered(1)), _originID(_id), _remoteID(0), _remoteOriginID(0) { @@ -131,7 +131,7 @@ void SharedObject::dump(QDebug debug) const { } } -int SharedObject::_lastID = 0; +QAtomicInt SharedObject::_nextID(1); WeakSharedObjectHash SharedObject::_weakHash; QReadWriteLock SharedObject::_weakHashLock; diff --git a/libraries/metavoxels/src/SharedObject.h b/libraries/metavoxels/src/SharedObject.h index 5ff5aa9680..407fc820c8 100644 --- a/libraries/metavoxels/src/SharedObject.h +++ b/libraries/metavoxels/src/SharedObject.h @@ -87,7 +87,7 @@ private: int _remoteOriginID; QAtomicInt _referenceCount; - static int _lastID; + static QAtomicInt _nextID; static WeakSharedObjectHash _weakHash; static QReadWriteLock _weakHashLock; };