/*****************************************************************************



*  Copyright (c) 1998-2001 Microsoft Corporation, All Rights Reserved

 *

 *                         All Rights Reserved

 *

 * This software is furnished under a license and may be used and copied

 * only in accordance with the terms of such license and with the inclusion

 * of the above copyright notice.  This software or any other copies thereof

 * may not be provided or otherwise  made available to any other person.  No

 * title to and ownership of the software is hereby transferred.

 *****************************************************************************/



//============================================================================

//

// CAutoLock.cpp -- Automatic locking class for mutexes and critical sections.

//

//  Copyright (c) 1998-2001 Microsoft Corporation, All Rights Reserved
//
// Revisions:    6/26/98    a-kevhu         Created
//
//============================================================================
#include "precomp.h"
#include "CAutoLock.h"

CAutoLock::CAutoLock(HANDLE hMutexHandle)
:  m_pCritSec(NULL),
   m_pcCritSec(NULL),
   m_pcMutex(NULL),
   m_hMutexHandle(hMutexHandle)
{
    ::WaitForSingleObject(m_hMutexHandle, INFINITE);
}

CAutoLock::CAutoLock(CMutex& rCMutex)
:  m_pCritSec(NULL),
   m_pcCritSec(NULL),
   m_hMutexHandle(NULL),
   m_pcMutex(&rCMutex)
{

    m_pcMutex->Wait(INFINITE);
}

CAutoLock::CAutoLock(CRITICAL_SECTION* pCritSec)
:  m_hMutexHandle(NULL),
   m_pcMutex(NULL),
   m_pcCritSec(NULL),
   m_pCritSec(pCritSec)
{
    ::EnterCriticalSection(m_pCritSec);
}

CAutoLock::CAutoLock(CCriticalSec& rCCritSec)
:  m_hMutexHandle(NULL),
   m_pcMutex(NULL),
   m_pCritSec(NULL),
   m_pcCritSec(&rCCritSec)
{
    m_pcCritSec->Enter();
}

// destructor...
CAutoLock::~CAutoLock()
{
    BOOL bStatus = TRUE;

    if (m_hMutexHandle)
    {
        bStatus = ::ReleaseMutex(m_hMutexHandle);
    }
    else if (m_pcMutex)
    {
        bStatus = m_pcMutex->Release();
    }
    else if (m_pCritSec)
    {
        ::LeaveCriticalSection(m_pCritSec);
    }
    else
    {
        m_pcCritSec->Leave();
    }

    if (!bStatus)
    {
        //CThrowError(::GetLastError());
        LogMessage2(L"CAutoLock Error: %d", ::GetLastError());
    }
}