#include <new>
#include <typeinfo>
#include <AutoLocker.h>
#include "Debug.h"
#include "ObjectTracker.h"
static char sTrackerBuffer[sizeof(ObjectTracker)];
ObjectTrackable::ObjectTrackable()
{
ObjectTracker* tracker = ObjectTracker::GetDefault();
if (tracker != NULL)
tracker->AddTrackable(this);
}
ObjectTrackable::~ObjectTrackable()
{
ObjectTracker* tracker = ObjectTracker::GetDefault();
if (tracker != NULL)
tracker->RemoveTrackable(this);
}
ObjectTracker::ObjectTracker()
: fLock("object tracker"),
fTrackables()
{
}
ObjectTracker::~ObjectTracker()
{
ObjectTrackable* trackable = fTrackables.First();
if (trackable) {
WARN(("ObjectTracker: WARNING: There are still undeleted objects:\n"));
#ifndef _KERNEL_MODE
for (; trackable; trackable = fTrackables.GetNext(trackable)) {
WARN((" trackable: %p: type: `%s'\n", trackable,
typeid(*trackable).name()));
}
#endif
}
}
ObjectTracker*
ObjectTracker::InitDefault()
{
if (!sTracker)
sTracker = new(sTrackerBuffer) ObjectTracker;
return sTracker;
}
void
ObjectTracker::ExitDefault()
{
if (sTracker) {
sTracker->~ObjectTracker();
sTracker = NULL;
}
}
ObjectTracker*
ObjectTracker::GetDefault()
{
return sTracker;
}
void
ObjectTracker::AddTrackable(ObjectTrackable* trackable)
{
if (trackable) {
AutoLocker<Locker> _(fLock);
fTrackables.Insert(trackable);
}
}
void
ObjectTracker::RemoveTrackable(ObjectTrackable* trackable)
{
if (trackable) {
AutoLocker<Locker> _(fLock);
fTrackables.Remove(trackable);
}
}
ObjectTracker* ObjectTracker::sTracker = NULL;