mirror of https://github.com/tongzx/nt5src
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.
126 lines
3.2 KiB
126 lines
3.2 KiB
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Lock.cpp
|
|
//
|
|
// Copyright (C) 1998, 1999 Microsoft Corporation. All rights reserved.
|
|
//
|
|
// Abstract :
|
|
//
|
|
// This is the implementation of the CLock class. This class was created in order to
|
|
// support automatic destruction of C++ object when an exception is thrown.
|
|
//
|
|
// Note :
|
|
//
|
|
// The CLock class is not thread safe (although the CCriticalSection class is). The CLock
|
|
// class should be used as a local variable when locking using a CCriticalSection object.
|
|
// This is done in order to warranty that all locks on an object are released when an
|
|
// exception is thrown.
|
|
//
|
|
// History :
|
|
//
|
|
// 05/06/1999 luish Created
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include <assert.h>
|
|
#include "Lock.h"
|
|
#include "ExceptionHandler.h"
|
|
#include "AppManDebug.h"
|
|
|
|
//To flag as DBG_LOCK
|
|
#ifdef DBG_MODULE
|
|
#undef DBG_MODULE
|
|
#endif
|
|
|
|
#define DBG_MODULE DBG_LOCK
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CLock::CLock(CCriticalSection * lpCriticalSection)
|
|
{
|
|
FUNCTION("CLock::CLock (CCriticalSection * lpCriticalSection)");
|
|
|
|
assert(NULL != lpCriticalSection);
|
|
|
|
//
|
|
// We need to record what the lock could of the critical section when the CLock object
|
|
// is created. When the object is destroyed we make sure that the lock count
|
|
// on the critical section object is the same as when CLock was created
|
|
//
|
|
|
|
m_lpCriticalSection = lpCriticalSection;
|
|
m_dwBaseLockCount = m_lpCriticalSection->GetLockCount();
|
|
m_dwLockCount = 0;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
CLock::~CLock(void)
|
|
{
|
|
FUNCTION("CLock::~CLock (void)");
|
|
|
|
DWORD dwLockCount;
|
|
|
|
do
|
|
{
|
|
dwLockCount = m_lpCriticalSection->GetLockCount();
|
|
|
|
//
|
|
// If the lock count on the critical section is greater than when the CLock object was
|
|
// created, then we call m_lpCriticalSection->Leave()
|
|
//
|
|
|
|
if (dwLockCount > m_dwBaseLockCount)
|
|
{
|
|
m_lpCriticalSection->Leave();
|
|
}
|
|
}
|
|
while (dwLockCount > m_dwBaseLockCount);
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CLock::Lock(void)
|
|
{
|
|
FUNCTION("CLock::Lock ()");
|
|
|
|
m_lpCriticalSection->Enter();
|
|
m_dwLockCount++;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CLock::UnLock(void)
|
|
{
|
|
FUNCTION("CLock::UnLock ()");
|
|
|
|
HRESULT hResult;
|
|
|
|
if (0 < m_dwLockCount)
|
|
{
|
|
hResult = m_lpCriticalSection->Leave();
|
|
|
|
//
|
|
// Make sure that hResult == S_OK and not S_FALSE
|
|
//
|
|
|
|
if (S_OK == hResult)
|
|
{
|
|
m_dwLockCount--;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
return S_FALSE;
|
|
}
|