1 /* 2 * Copyright 2005-2009, Ingo Weinhold, ingo_weinhold@gmx.de. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include <Referenceable.h> 8 9 10 //#define TRACE_REFERENCEABLE 11 #ifdef TRACE_REFERENCEABLE 12 # include <tracing.h> 13 # define TRACE(x, ...) ktrace_printf(x, __VA_ARGS__); 14 #else 15 # define TRACE(x, ...) 16 #endif 17 18 19 BReferenceable::BReferenceable(bool deleteWhenUnreferenced) 20 : 21 fReferenceCount(1), 22 fDeleteWhenUnreferenced(deleteWhenUnreferenced) 23 { 24 } 25 26 27 BReferenceable::~BReferenceable() 28 { 29 } 30 31 32 void 33 BReferenceable::AcquireReference() 34 { 35 if (atomic_add(&fReferenceCount, 1) == 0) 36 FirstReferenceAcquired(); 37 38 TRACE("%p: acquire %ld\n", this, fReferenceCount); 39 } 40 41 42 bool 43 BReferenceable::ReleaseReference() 44 { 45 bool unreferenced = (atomic_add(&fReferenceCount, -1) == 1); 46 TRACE("%p: release %ld\n", this, fReferenceCount); 47 if (unreferenced) 48 LastReferenceReleased(); 49 return unreferenced; 50 } 51 52 53 void 54 BReferenceable::FirstReferenceAcquired() 55 { 56 } 57 58 59 void 60 BReferenceable::LastReferenceReleased() 61 { 62 if (fDeleteWhenUnreferenced) 63 delete this; 64 } 65