Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
//***************************************************************************
//
// 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; }
|