⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reference_counter.cpp

📁 这是DVD中伺服部分的核心代码
💻 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 + -