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