276 lines
7.4 KiB
C++
276 lines
7.4 KiB
C++
|
|
/*//===============================================================
|
|||
|
|
|
|||
|
|
<< CRITICAL SECTION >>
|
|||
|
|
|
|||
|
|
PRGM : milkji, B4nFter
|
|||
|
|
|
|||
|
|
FILE : CRITICALSECTION.HPP
|
|||
|
|
DESC : <EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ȯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ӱ豸<EFBFBD><EFBFBD>
|
|||
|
|
INIT BUILT DATE : 2005. 06. 02
|
|||
|
|
LAST BUILT DATE : 2005. 06. 02
|
|||
|
|
|
|||
|
|
P.S.>
|
|||
|
|
- DEBUG <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD>Ӱ豸<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> API<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ϴ°<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
- RELEASE <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> : <EFBFBD>Ӱ豸<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> API<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
Copyright<EFBFBD><EFBFBD> 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved.
|
|||
|
|
|
|||
|
|
*///===============================================================
|
|||
|
|
|
|||
|
|
|
|||
|
|
#pragma once
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// INCLUDE
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
#include "LOCKBASE.HPP"
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// DEFINE
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// DECLARATION
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : CLASS
|
|||
|
|
// NAME : CCriticalSection
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : Critical Section Class
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
class CCriticalSection : public CLockBase
|
|||
|
|
{
|
|||
|
|
private:
|
|||
|
|
DISABLE_COPY_ASSIGN(CCriticalSection) // <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
CCriticalSection();
|
|||
|
|
virtual ~CCriticalSection();
|
|||
|
|
|
|||
|
|
DWORD Open(DWORD dwSpinCount = 0);
|
|||
|
|
VOID Close();
|
|||
|
|
|
|||
|
|
BOOL IsOpen() const;
|
|||
|
|
|
|||
|
|
VOID Lock(BOOL bDoCheck = FALSE) const;
|
|||
|
|
BOOL LockTry() const;
|
|||
|
|
VOID Unlock() const;
|
|||
|
|
|
|||
|
|
#if defined(_DEBUG)
|
|||
|
|
BOOL IsLock() const;
|
|||
|
|
#endif // #if defined(_DEBUG)
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
VOID Reset();
|
|||
|
|
|
|||
|
|
private:
|
|||
|
|
mutable CRITICAL_SECTION m_crThis;
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
// IMPLEMENTATION
|
|||
|
|
///////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::CCriticalSection
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : 1 . lpCriticalSection - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>Ӱ豸<D3B0><E8B1B8> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
inline CCriticalSection::CCriticalSection()
|
|||
|
|
{
|
|||
|
|
Reset();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::~CCriticalSection
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
inline CCriticalSection::~CCriticalSection()
|
|||
|
|
{
|
|||
|
|
Close();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::Open
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><>ü <20><><EFBFBD><EFBFBD>, <20>ڿ<EFBFBD> <20>ʱ<EFBFBD>ȭ
|
|||
|
|
// PARM : 1 . dwSpinCount -
|
|||
|
|
// RETV : NOERROR - <20><><EFBFBD><EFBFBD> / <20><EFBFBD> - <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
#pragma warning(disable:4100)
|
|||
|
|
inline DWORD CCriticalSection::Open(DWORD dwSpinCount)
|
|||
|
|
{
|
|||
|
|
::memset(&m_crThis, '\0', sizeof(m_crThis));
|
|||
|
|
|
|||
|
|
#if ((WINVER >= 0x0500) && (_WIN32_WINNT >= 0x0403))
|
|||
|
|
if (dwSpinCount > 0) {
|
|||
|
|
/*
|
|||
|
|
P.S.>
|
|||
|
|
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ī<EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ʈ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>Ʈ<EFBFBD>ϸ<EFBFBD> ::EnterCriticalSection() <EFBFBD><EFBFBD> <EFBFBD>ʿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ڿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD≯<EFBFBD> <EFBFBD>Ҵ<EFBFBD>
|
|||
|
|
- <EFBFBD>̰<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>緮<EFBFBD><EFBFBD> Non-Paged Pool <EFBFBD><EFBFBD> <EFBFBD>Һ<EFBFBD><EFBFBD>ϹǷ<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>Ӱ豸<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
- <EFBFBD>̰<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Windows Server 2000 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (XP <EFBFBD>̻<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ŵ<EFBFBD>)
|
|||
|
|
*/
|
|||
|
|
// dwSpinCount |= 0x80000000;
|
|||
|
|
|
|||
|
|
if (::InitializeCriticalSectionAndSpinCount(&m_crThis, dwSpinCount)) {
|
|||
|
|
m_bIsOpen = TRUE;
|
|||
|
|
return (NOERROR);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif // #if ((WINVER >= 0x0500) && (_WIN32_WINNT >= 0x0500))
|
|||
|
|
|
|||
|
|
DWORD dwRetVal;
|
|||
|
|
__try {
|
|||
|
|
::InitializeCriticalSection(&m_crThis);
|
|||
|
|
m_bIsOpen = TRUE;
|
|||
|
|
dwRetVal = NOERROR;
|
|||
|
|
}
|
|||
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|||
|
|
{
|
|||
|
|
dwRetVal = STATUS_NO_MEMORY;
|
|||
|
|
}
|
|||
|
|
return dwRetVal;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
#pragma warning(default:4100)
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::Close
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><>ü <20><><EFBFBD><EFBFBD>, <20>ڿ<EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
inline VOID CCriticalSection::Close()
|
|||
|
|
{
|
|||
|
|
if (m_bIsOpen) {
|
|||
|
|
::DeleteCriticalSection(&m_crThis);
|
|||
|
|
Reset();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::IsOpen
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20>غ<EFBFBD><D8BA>Ǿ<EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> üũ
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - Ʋ<><C6B2>
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
inline BOOL CCriticalSection::IsOpen() const
|
|||
|
|
{
|
|||
|
|
return m_bIsOpen;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::Lock
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20>Ӱ豸<D3B0><E8B1B8> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : 1 . bDoCheck -
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
#pragma warning(disable:4100)
|
|||
|
|
inline VOID CCriticalSection::Lock(BOOL bDoCheck) const
|
|||
|
|
{
|
|||
|
|
::EnterCriticalSection(&m_crThis);
|
|||
|
|
}
|
|||
|
|
#pragma warning(default:4100)
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::LockTry
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20>Ӱ豸<D3B0><E8B1B8> <20><><EFBFBD><EFBFBD> <20>õ<EFBFBD>
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
inline BOOL CCriticalSection::LockTry() const
|
|||
|
|
{
|
|||
|
|
#if (WINVER >= 0x0500)
|
|||
|
|
if (::TryEnterCriticalSection(&m_crThis))
|
|||
|
|
return(TRUE);
|
|||
|
|
else
|
|||
|
|
return(FALSE);
|
|||
|
|
#else // #if (WINVER >= 0x0500)
|
|||
|
|
BASE_RETURN(FALSE);
|
|||
|
|
#endif // #if (WINVER >= 0x0500)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::Unlock
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20>Ӱ豸<D3B0><E8B1B8> <20><><EFBFBD><EFBFBD>
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
inline VOID CCriticalSection::Unlock() const
|
|||
|
|
{
|
|||
|
|
::LeaveCriticalSection(&m_crThis);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::IsLock
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20>Ӱ豸<D3B0><E8B1B8><EFBFBD><EFBFBD> <20>̹<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ִ<EFBFBD><D6B4><EFBFBD> üũ
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - Ʋ<><C6B2>
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
#if defined(_DEBUG)
|
|||
|
|
inline BOOL CCriticalSection::IsLock() const
|
|||
|
|
{
|
|||
|
|
return((0 < m_crThis.RecursionCount) && (::GetCurrentThreadId() == HandleToUlong(m_crThis.OwningThread)));
|
|||
|
|
}
|
|||
|
|
#endif // #if defined(_DEBUG)
|
|||
|
|
|
|||
|
|
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// TYPE : FUNCTION
|
|||
|
|
// NAME : CCriticalSection::Reset
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
// DESC : <20><>ü <20>ڿ<EFBFBD> <20>ʱ<EFBFBD>ȭ
|
|||
|
|
// PARM : N/A
|
|||
|
|
// RETV : N/A
|
|||
|
|
// PRGM : milkji, B4nFter
|
|||
|
|
//*---------------------------------------------------------------
|
|||
|
|
inline VOID CCriticalSection::Reset()
|
|||
|
|
{
|
|||
|
|
m_bIsOpen = FALSE;
|
|||
|
|
}
|
|||
|
|
|