113 lines
3 KiB
C++
113 lines
3 KiB
C++
// --------------------------------------------------------------------------
|
|
// Module Name: CountedObjects.cpp
|
|
//
|
|
// Copyright (c) 1999-2000, Microsoft Corporation
|
|
//
|
|
// Base class that implements object reference counting
|
|
//
|
|
// History: 1999-08-17 vtan created
|
|
// 2000-02-01 vtan moved from Neptune to Whistler
|
|
// --------------------------------------------------------------------------
|
|
|
|
#include "StandardHeader.h"
|
|
#include "CountedObject.h"
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CCountedObject::CCountedObject
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: Initializes the reference count to 1.
|
|
//
|
|
// History: 1999-08-17 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
CCountedObject::CCountedObject (void) :
|
|
_lReferenceCount(1),
|
|
_fReleased(false)
|
|
|
|
{
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CCountedObject::~CCountedObject
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: Virtual destructor that just checks valid deletion.
|
|
//
|
|
// History: 1999-08-17 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
CCountedObject::~CCountedObject (void)
|
|
|
|
{
|
|
ASSERTMSG(_fReleased, "CCountedObject::~CCountedObject invoked without being released");
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CCountedObject::AddRef
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: Increments the object's reference count.
|
|
//
|
|
// History: 1999-08-17 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
void CCountedObject::AddRef (void)
|
|
|
|
{
|
|
InterlockedIncrement(&_lReferenceCount);
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CCountedObject::Release
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: <none>
|
|
//
|
|
// Purpose: Decrements the object's reference count. When the count
|
|
// reaches zero the object is deleted. Do NOT use referenced
|
|
// objects when using stack based objects. These must be
|
|
// dynamically allocated.
|
|
//
|
|
// History: 1999-08-17 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
void CCountedObject::Release (void)
|
|
|
|
{
|
|
if (InterlockedDecrement(&_lReferenceCount) == 0)
|
|
{
|
|
_fReleased = true;
|
|
delete this;
|
|
}
|
|
}
|
|
|
|
// --------------------------------------------------------------------------
|
|
// CCountedObject::GetCount
|
|
//
|
|
// Arguments: <none>
|
|
//
|
|
// Returns: LONG
|
|
//
|
|
// Purpose: Returns the count of outstanding references on the object.
|
|
//
|
|
// History: 2000-07-17 vtan created
|
|
// --------------------------------------------------------------------------
|
|
|
|
LONG CCountedObject::GetCount (void) const
|
|
|
|
{
|
|
return(_lReferenceCount);
|
|
}
|
|
|