diff --git a/renderdoc/core/resource_manager.cpp b/renderdoc/core/resource_manager.cpp index b7b03046f..27b58d621 100644 --- a/renderdoc/core/resource_manager.cpp +++ b/renderdoc/core/resource_manager.cpp @@ -63,9 +63,9 @@ void ResourceRecord::AddResourceReferences(ResourceRecordHandler *mgr) void ResourceRecord::Delete(ResourceRecordHandler *mgr) { - RefCount--; - RDCASSERT(RefCount >= 0); - if(RefCount <= 0) + int32_t ref = Atomic::Dec32(&RefCount); + RDCASSERT(ref >= 0); + if(ref <= 0) { for(auto it = Parents.begin(); it != Parents.end(); ++it) (*it)->Delete(mgr); diff --git a/renderdoc/core/resource_manager.h b/renderdoc/core/resource_manager.h index b60de33f4..bc8edee84 100644 --- a/renderdoc/core/resource_manager.h +++ b/renderdoc/core/resource_manager.h @@ -156,7 +156,7 @@ struct ResourceRecord recordlist.insert(m_Chunks.begin(), m_Chunks.end()); } - void AddRef() { RefCount++; } + void AddRef() { Atomic::Inc32(&RefCount); } int GetRefCount() const { return RefCount; } void Delete(ResourceRecordHandler *mgr); @@ -269,7 +269,7 @@ struct ResourceRecord bool DataWritten; protected: - int RefCount; + volatile int32_t RefCount; byte *DataPtr; uint64_t DataOffset; diff --git a/renderdoc/os/linux/linux_threading.cpp b/renderdoc/os/linux/linux_threading.cpp index c4b7cb2a5..4fc1e1f68 100644 --- a/renderdoc/os/linux/linux_threading.cpp +++ b/renderdoc/os/linux/linux_threading.cpp @@ -52,6 +52,11 @@ namespace Atomic { return __sync_add_and_fetch(i, int32_t(1)); } + + int32_t Dec32(volatile int32_t *i) + { + return __sync_add_and_fetch(i, int32_t(-1)); + } int64_t Inc64(volatile int64_t *i) { diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index bb898d9b4..4502f35c1 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -166,6 +166,7 @@ namespace Network namespace Atomic { int32_t Inc32(volatile int32_t *i); + int32_t Dec32(volatile int32_t *i); int64_t Inc64(volatile int64_t *i); int64_t Dec64(volatile int64_t *i); int64_t ExchAdd64(volatile int64_t *i, int64_t a); diff --git a/renderdoc/os/win32/win32_threading.cpp b/renderdoc/os/win32/win32_threading.cpp index 4b8967d51..e52ba1f46 100644 --- a/renderdoc/os/win32/win32_threading.cpp +++ b/renderdoc/os/win32/win32_threading.cpp @@ -54,6 +54,11 @@ namespace Atomic { return (int32_t)InterlockedIncrement((volatile LONG *)i); } + + int32_t Dec32(volatile int32_t *i) + { + return (int32_t)InterlockedDecrement((volatile LONG *)i); + } int64_t Inc64(volatile int64_t *i) {