oculus1
annotate libovr/Src/Kernel/OVR_RefCount.cpp @ 23:0c76f70fb7e9
merged
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 28 Sep 2013 04:13:33 +0300 |
parents | e2f9e4603129 |
children |
rev | line source |
---|---|
nuclear@3 | 1 /************************************************************************************ |
nuclear@3 | 2 |
nuclear@3 | 3 Filename : OVR_RefCount.cpp |
nuclear@3 | 4 Content : Reference counting implementation |
nuclear@3 | 5 Created : September 19, 2012 |
nuclear@3 | 6 Notes : |
nuclear@3 | 7 |
nuclear@3 | 8 Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. |
nuclear@3 | 9 |
nuclear@3 | 10 Use of this software is subject to the terms of the Oculus license |
nuclear@3 | 11 agreement provided at the time of installation or download, or which |
nuclear@3 | 12 otherwise accompanies this software in either electronic or hard copy form. |
nuclear@3 | 13 |
nuclear@3 | 14 ************************************************************************************/ |
nuclear@3 | 15 |
nuclear@3 | 16 #include "OVR_RefCount.h" |
nuclear@3 | 17 #include "OVR_Atomic.h" |
nuclear@3 | 18 #include "OVR_Log.h" |
nuclear@3 | 19 |
nuclear@3 | 20 namespace OVR { |
nuclear@3 | 21 |
nuclear@3 | 22 #ifdef OVR_CC_ARM |
nuclear@3 | 23 void* ReturnArg0(void* p) |
nuclear@3 | 24 { |
nuclear@3 | 25 return p; |
nuclear@3 | 26 } |
nuclear@3 | 27 #endif |
nuclear@3 | 28 |
nuclear@3 | 29 // ***** Reference Count Base implementation |
nuclear@3 | 30 |
nuclear@3 | 31 RefCountImplCore::~RefCountImplCore() |
nuclear@3 | 32 { |
nuclear@3 | 33 // RefCount can be either 1 or 0 here. |
nuclear@3 | 34 // 0 if Release() was properly called. |
nuclear@3 | 35 // 1 if the object was declared on stack or as an aggregate. |
nuclear@3 | 36 OVR_ASSERT(RefCount <= 1); |
nuclear@3 | 37 } |
nuclear@3 | 38 |
nuclear@3 | 39 #ifdef OVR_BUILD_DEBUG |
nuclear@3 | 40 void RefCountImplCore::reportInvalidDelete(void *pmem) |
nuclear@3 | 41 { |
nuclear@3 | 42 OVR_DEBUG_LOG( |
nuclear@3 | 43 ("Invalid delete call on ref-counted object at %p. Please use Release()", pmem)); |
nuclear@3 | 44 OVR_ASSERT(0); |
nuclear@3 | 45 } |
nuclear@3 | 46 #endif |
nuclear@3 | 47 |
nuclear@3 | 48 RefCountNTSImplCore::~RefCountNTSImplCore() |
nuclear@3 | 49 { |
nuclear@3 | 50 // RefCount can be either 1 or 0 here. |
nuclear@3 | 51 // 0 if Release() was properly called. |
nuclear@3 | 52 // 1 if the object was declared on stack or as an aggregate. |
nuclear@3 | 53 OVR_ASSERT(RefCount <= 1); |
nuclear@3 | 54 } |
nuclear@3 | 55 |
nuclear@3 | 56 #ifdef OVR_BUILD_DEBUG |
nuclear@3 | 57 void RefCountNTSImplCore::reportInvalidDelete(void *pmem) |
nuclear@3 | 58 { |
nuclear@3 | 59 OVR_DEBUG_LOG( |
nuclear@3 | 60 ("Invalid delete call on ref-counted object at %p. Please use Release()", pmem)); |
nuclear@3 | 61 OVR_ASSERT(0); |
nuclear@3 | 62 } |
nuclear@3 | 63 #endif |
nuclear@3 | 64 |
nuclear@3 | 65 |
nuclear@3 | 66 // *** Thread-Safe RefCountImpl |
nuclear@3 | 67 |
nuclear@3 | 68 void RefCountImpl::AddRef() |
nuclear@3 | 69 { |
nuclear@3 | 70 AtomicOps<int>::ExchangeAdd_NoSync(&RefCount, 1); |
nuclear@3 | 71 } |
nuclear@3 | 72 void RefCountImpl::Release() |
nuclear@3 | 73 { |
nuclear@3 | 74 if ((AtomicOps<int>::ExchangeAdd_NoSync(&RefCount, -1) - 1) == 0) |
nuclear@3 | 75 delete this; |
nuclear@3 | 76 } |
nuclear@3 | 77 |
nuclear@3 | 78 // *** Thread-Safe RefCountVImpl w/virtual AddRef/Release |
nuclear@3 | 79 |
nuclear@3 | 80 void RefCountVImpl::AddRef() |
nuclear@3 | 81 { |
nuclear@3 | 82 AtomicOps<int>::ExchangeAdd_NoSync(&RefCount, 1); |
nuclear@3 | 83 } |
nuclear@3 | 84 void RefCountVImpl::Release() |
nuclear@3 | 85 { |
nuclear@3 | 86 if ((AtomicOps<int>::ExchangeAdd_NoSync(&RefCount, -1) - 1) == 0) |
nuclear@3 | 87 delete this; |
nuclear@3 | 88 } |
nuclear@3 | 89 |
nuclear@3 | 90 // *** NON-Thread-Safe RefCountImpl |
nuclear@3 | 91 |
nuclear@3 | 92 void RefCountNTSImpl::Release() const |
nuclear@3 | 93 { |
nuclear@3 | 94 RefCount--; |
nuclear@3 | 95 if (RefCount == 0) |
nuclear@3 | 96 delete this; |
nuclear@3 | 97 } |
nuclear@3 | 98 |
nuclear@3 | 99 |
nuclear@3 | 100 } // OVR |