📄 reference_counter.cpp
字号:
/******************************************************************************
*******************************************************************************
** **
** Copyright (c) 2006 Videon Central, Inc. **
** All rights reserved. **
** **
** The computer program contained herein contains proprietary information **
** which is the property of Videon Central, Inc. The program may be used **
** and/or copied only with the written permission of Videon Central, Inc. **
** or in accordance with the terms and conditions stipulated in the **
** agreement/contract under which the programs have been supplied. **
** **
*******************************************************************************
******************************************************************************/
/**
* @file reference_counter.cpp
*
* $Revision: 1.5 $
*
* Base class for objects that require reference counting
*
*/
#include <assert.h>
#include "mutex.h"
#include "reference_counter.h"
/**
*******************************************************************************
* ReferenceChecker::ReferenceChecker initializes members to known state
*
*******************************************************************************/
ReferenceChecker::ReferenceChecker ( void )
{
m_referenceCount = 0;
}
/**
*******************************************************************************
* ReferenceChecker::~ReferenceChecker check object was destroyed properly
*
*******************************************************************************/
ReferenceChecker::~ReferenceChecker ( void )
{
assert( m_referenceCount == 0 );
}
/**
*******************************************************************************
* ReferenceChecker::Create increments the object's reference counter
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
* @return VDVD_ERROR_OBJECT_HAS_INVALID_STATE if object has already been created
*******************************************************************************/
VDVD_ERROR ReferenceChecker::Create ( void )
{
VDVD_ASSERT_ERROR( (IsReferenced()==TRUE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
m_referenceCount++;
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* ReferenceChecker::Destroy decrements the object's reference counter
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
* @return VDVD_ERROR_UNABLE_TO_DELETE_REFERENCE - already been destroyed
* @retrun VDVD_ERROR_OBJECT_HAS_INVALID_STATE - reference count invalid
*******************************************************************************/
VDVD_ERROR ReferenceChecker::Destroy ( void )
{
VDVD_ASSERT_ERROR( (IsReferenced()==FALSE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
m_referenceCount--;
VDVD_ASSERT_ERROR( (IsReferenced()==TRUE), VDVD_ERROR_OBJECT_HAS_INVALID_STATE );
return ( VDVD_SUCCESS );
}
/**
*******************************************************************************
* ReferenceChecker::IsReferenced checks if the object has been referenced
*
* @return TRUE = the object is referenced(someone is using it and it is therefore created)
* @return FALSE = the object has never been referenced (no one is using it)
*******************************************************************************/
BOOLEAN ReferenceChecker::IsReferenced ( void )
{
if ( m_referenceCount == 0 )
{
return ( FALSE );
}
return ( TRUE );
}
/**
*******************************************************************************
* ReferenceCounter::AddReference increments the object's reference counter
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
*******************************************************************************/
VDVD_ERROR ReferenceCounter::AddReference ( void )
{
VDVD_ERROR error = VDVD_SUCCESS;
VDVD_RAISE_ERROR( m_mutex.Lock() );
if ( m_referenceCount == 0 )
{
error = Construct();
if ( error == VDVD_SUCCESS )
{
m_referenceCount++;
}
}
else
{
m_referenceCount++;
}
VDVD_RAISE_ERROR( m_mutex.Unlock() );
return ( error );
}
/**
*******************************************************************************
* ReferenceCounter::DeleteReference decrements the object's reference counter
*
* @return If the function succeeds, the return value is VDVD_SUCCESS.
* @return VDVD_ERROR_UNABLE_TO_DELETE_REFERENCE - reference count is currently 0
*******************************************************************************/
VDVD_ERROR ReferenceCounter::DeleteReference ( void )
{
VDVD_ERROR error = VDVD_SUCCESS;
VDVD_RAISE_ERROR( m_mutex.Lock() );
switch ( m_referenceCount )
{
case 0:
error = VDVD_ERROR_OBJECT_HAS_INVALID_STATE;
break;
case 1:
m_referenceCount = 0;
error = Destruct();
break;
default:
m_referenceCount--;
error = VDVD_SUCCESS;
break;
}
VDVD_RAISE_ERROR( m_mutex.Unlock() );
return ( error );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -