DragonNest/Server/ServiceMonitorEx/Source/CriticalSection.hpp

276 lines
7.4 KiB
C++
Raw Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< 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;
}