xref: /haiku/src/kits/support/Referenceable.cpp (revision 675ffabd70492a962f8c0288a32208c22ce5de18)
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