xref: /haiku/src/add-ons/kernel/file_systems/userlandfs/shared/ObjectTracker.cpp (revision c2751c41b7404c4e7b0b6ed723b92505a6cf332b)
1 // ObjectTracker.h
2 
3 #include <new>
4 #include <typeinfo>
5 
6 #include <AutoLocker.h>
7 
8 #include "Debug.h"
9 #include "ObjectTracker.h"
10 
11 static char sTrackerBuffer[sizeof(ObjectTracker)];
12 
13 // constructor
14 ObjectTrackable::ObjectTrackable()
15 {
16 	ObjectTracker::GetDefault()->AddTrackable(this);
17 }
18 
19 // destructor
20 ObjectTrackable::~ObjectTrackable()
21 {
22 	ObjectTracker::GetDefault()->RemoveTrackable(this);
23 }
24 
25 
26 // #pragma mark -
27 
28 // constructor
29 ObjectTracker::ObjectTracker()
30 	: fLock("object tracker"),
31 	  fTrackables()
32 {
33 }
34 
35 // destructor
36 ObjectTracker::~ObjectTracker()
37 {
38 	ObjectTrackable* trackable = fTrackables.First();
39 	if (trackable) {
40 		WARN(("ObjectTracker: WARNING: There are still undeleted objects:\n"));
41 #ifndef _KERNEL_MODE
42 		for (; trackable; trackable = fTrackables.GetNext(trackable)) {
43 			WARN(("  trackable: %p: type: `%s'\n", trackable,
44 				typeid(*trackable).name()));
45 		}
46 #endif
47 	}
48 }
49 
50 // InitDefault
51 ObjectTracker*
52 ObjectTracker::InitDefault()
53 {
54 	if (!sTracker)
55 		sTracker = new(sTrackerBuffer) ObjectTracker;
56 	return sTracker;
57 }
58 
59 // ExitDefault
60 void
61 ObjectTracker::ExitDefault()
62 {
63 	if (sTracker) {
64 		sTracker->~ObjectTracker();
65 		sTracker = NULL;
66 	}
67 }
68 
69 // GetDefault
70 ObjectTracker*
71 ObjectTracker::GetDefault()
72 {
73 	return sTracker;
74 }
75 
76 // AddTrackable
77 void
78 ObjectTracker::AddTrackable(ObjectTrackable* trackable)
79 {
80 	if (!this)
81 		return;
82 
83 	if (trackable) {
84 		AutoLocker<Locker> _(fLock);
85 		fTrackables.Insert(trackable);
86 	}
87 }
88 
89 // RemoveTrackable
90 void
91 ObjectTracker::RemoveTrackable(ObjectTrackable* trackable)
92 {
93 	if (!this)
94 		return;
95 
96 	if (trackable) {
97 		AutoLocker<Locker> _(fLock);
98 		fTrackables.Remove(trackable);
99 	}
100 }
101 
102 // sTracker
103 ObjectTracker* ObjectTracker::sTracker = NULL;
104 
105