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