Back to the WFC main page
CGarbageCollector
$Revision: 16 $
Description
This class implements a simple garbage collector. You inherit from
CGarbageCollector and your class will self destruct when the
reference count reaches zero.
CGarbageCollector should only
be set to self destruct when it has been created via
new
.
Methods
void AddReference( void )
-
This increments the reference count and prevents the
object from being deleted.
void Dump( CDumpContext& dump_context ) const
-
Present only in debug builds. Dumps interesting information about
CGarbageCollector to the
dump_context
provided.
BOOL GetSelfDestruct( void ) const
-
Returns whether this object will self destruct when the
reference count reaches zero.
long GetReferenceCount( void ) const
-
Returns the reference count.
void Release( BOOL * deleted = NULL )
-
Decrements the reference count and checks to see if it is zero.
If the reference count is zero, the object will self destruct
(i.e. call
delete this
). If deleted
is
not NULL, it will be filled with TRUE if the object was deleted
or FALSE if there are still references to it somewhere.
void SetSelfDestruct( BOOL self_destruct = TRUE )
-
This should be called after CGarbageCollector has been
created via
new
.
Example
#include <wfc.h>
#pragma hdrstop
class CThreadData : public CGarbageCollector
{
protected:
DWORD m_Data;
public:
void SetData( DWORD data ) { m_Data = data; };
DWORD GetData( void ) const { return( m_Data ); };
};
void worker_thread( void * parameter )
{
WFCTRACEINIT( TEXT( "worker_thread()" ) );
CThreadData * thread_data = (CThreadData *) parameter;
// Make sure the thread data is around until we call Release
thread_data->AddReference();
// Go do something that takes a really long time
Sleep( 10000 );
thread_data->Release();
}
void start_thread( void )
{
WFCTRACEINIT( TEXT( "start_thread()" ) );
CThreadData * data_p = NULL;
try
{
data_p = new CThreadData;
}
catch( ... )
{
return;
}
data_p->AddReference();
data_p->SetSelfDestruct( TRUE );
_beginthread( worker_thread, 0, data_p );
Sleep( 0 );
data_p->Release();
}
Copyright, 2000, Samuel R. Blackburn
$Workfile: CGarbageCollector.cpp $
$Modtime: 1/17/00 9:05a $