windows-nt/Source/XPSP1/NT/admin/wmi/wbem/sdk/framedyn/threadbase.cpp
2020-09-26 16:20:57 +08:00

139 lines
3.1 KiB
C++

//***************************************************************************
//
// Copyright (c) 1997-2001 Microsoft Corporation, All Rights Reserved
//
// ThreadBase.CPP
//
// Purpose: Implementation of CThreadBase class
//
//***************************************************************************
#include "precomp.h"
#include <assertbreak.h>
////////////////////////////////////////////////////////////////////////
//
// Function: CThreadBase::CThreadBase
//
// Class Constructor.
//
// Inputs: THREAD_SAFETY_MECHANISM etsm - Thread Safety Mechanism.
//
// Outputs: None.
//
// Return: None.
//
// Comments: None.
//
////////////////////////////////////////////////////////////////////////
CThreadBase::CThreadBase( THREAD_SAFETY_MECHANISM etsm /*=etsmSerialized*/ )
: m_lRefCount( 1 ), // Our initial ref count is always 1
m_etsm( etsm )
{
InitializeCriticalSection( &m_cs ); // Void function, so it best work.
}
////////////////////////////////////////////////////////////////////////
//
// Function: CThreadBase::~CThreadBase
//
// Class Destructor.
//
// Inputs: None.
//
// Outputs: None.
//
// Return: None.
//
// Comments: None.
//
////////////////////////////////////////////////////////////////////////
CThreadBase::~CThreadBase( void )
{
DeleteCriticalSection( &m_cs );
}
////////////////////////////////////////////////////////////////////////
//
// Function: CThreadBase::OnFinalRelease
//
// Virtual function called by Release() when our RefCount reaches 0.
//
// Inputs: None.
//
// Outputs: None.
//
// Return: None.
//
// Comments: Override if you want, but always call down to the base
// implementation and let it call delete on 'this'.
//
////////////////////////////////////////////////////////////////////////
void CThreadBase::OnFinalRelease( void )
{
delete this;
}
////////////////////////////////////////////////////////////////////////
//
// Function: CThreadBase::AddRef
//
// Increases our Reference count by one.
//
// Inputs: None.
//
// Outputs: None.
//
// Return: None.
//
// Comments: Uses Lock(), Unlock() to protect the data. We may want
// to change the function to use InterlockedIncrement().
//
////////////////////////////////////////////////////////////////////////
LONG CThreadBase::AddRef( void )
{
LONG nRet = InterlockedIncrement(&m_lRefCount);
return nRet;
}
////////////////////////////////////////////////////////////////////////
//
// Function: CThreadBase::Release
//
// Decreases our Reference count by one.
//
// Inputs: None.
//
// Outputs: None.
//
// Return: None.
//
// Comments: Uses Lock(), Unlock() to protect the data. We may want
// to use InterlockedDecrement();
//
////////////////////////////////////////////////////////////////////////
LONG CThreadBase::Release( void )
{
LONG nRet;
BOOL fFinalRelease = ( (nRet = InterlockedDecrement(&m_lRefCount)) == 0 );
ASSERT_BREAK(nRet >= 0);
if ( fFinalRelease )
{
OnFinalRelease();
}
return nRet;
}