/*//=============================================================== << CRITICAL SECTION >> PRGM : milkji, B4nFter FILE : CRITICALSECTION.HPP DESC : ÀÚµ¿ÇØÁ¦ ±â´ÉÀ» °¡Áø È®ÀåµÈ ÀӰ豸¿ª INIT BUILT DATE : 2005. 06. 02 LAST BUILT DATE : 2005. 06. 02 P.S.> - DEBUG ¸ðµå ÄÄÆÄÀÏ : ÀӰ豸¿ª °ü·Ã API·Î ÁøÀÔ/ÇØÁ¦ ÇÏ´Â°Í º¸´Ù 3¹è Á¤µµÀÇ ¼º´ÉÀúÇÏ - RELEASE ¸ðµå ÄÄÆÄÀÏ : ÀӰ豸¿ª °ü·Ã API¿Í °ÅÀÇ ¼º´ÉÂ÷ÀÌ ¾øÀ½ Copyright¨Ï 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) // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö 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 : »ý¼ºÀÚ // PARM : 1 . lpCriticalSection - »ý¼ºµÈ ÀӰ豸¿ª °´Ã¼ÀÇ Æ÷ÀÎÅÍ // RETV : N/A // PRGM : milkji, B4nFter //*--------------------------------------------------------------- inline CCriticalSection::CCriticalSection() { Reset(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CCriticalSection::~CCriticalSection //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : milkji, B4nFter //*--------------------------------------------------------------- inline CCriticalSection::~CCriticalSection() { Close(); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CCriticalSection::Open //*--------------------------------------------------------------- // DESC : °´Ã¼ ½ÃÀÛ, ÀÚ¿ø ÃʱâÈ­ // PARM : 1 . dwSpinCount - // RETV : NOERROR - ¼º°ø / ±×¿Ü - ½ÇÆÐ // 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.> - ½ºÇÉÄ«¿îÆ®ÀÇ ÃÖ»óÀ§ ºñÆ®¸¦ ¼¼Æ®Çϸé ::EnterCriticalSection() ¿¡ ÇÊ¿äÇÑ ÀÚ¿øÀ» ¹Ì¸® ÇÒ´ç - À̰ÍÀº »ó´ç·®ÀÇ Non-Paged Pool À» ¼ÒºñÇϹǷΠ¸¹Àº ¼öÀÇ ÀӰ豸¿ª »ý¼º ½Ã ²¨¾ßÇÔ - À̰ÍÀº ¿ÀÁ÷ Windows Server 2000 ¿¡¼­¸¸ µ¿ÀÛÇÔ (XP À̻󿡼­´Â Á¦°ÅµÊ) */ // 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 : °´Ã¼ Á¾·á, ÀÚ¿ø ÇØÁ¦ // 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 : ÇöÀç °´Ã¼°¡ ÁغñµÇ¾î ÀÖ´ÂÁö üũ // PARM : N/A // RETV : TRUE - ¸ÂÀ½ / FALSE - Ʋ¸² // PRGM : milkji, B4nFter //*--------------------------------------------------------------- inline BOOL CCriticalSection::IsOpen() const { return m_bIsOpen; } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CCriticalSection::Lock //*--------------------------------------------------------------- // DESC : ÀӰ豸¿ª ÁøÀÔ // 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 : ÀӰ豸¿ª ÁøÀÔ ½Ãµµ // PARM : N/A // RETV : TRUE - ¼º°ø / FALSE - ½ÇÆÐ // 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 : ÀӰ豸¿ª ÇØÁ¦ // PARM : N/A // RETV : N/A // PRGM : milkji, B4nFter //*--------------------------------------------------------------- inline VOID CCriticalSection::Unlock() const { ::LeaveCriticalSection(&m_crThis); } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CCriticalSection::IsLock //*--------------------------------------------------------------- // DESC : ÀӰ豸¿ª¿¡ ÀÌ¹Ì ÁøÀÔÇØ ÀÖ´ÂÁö üũ // PARM : N/A // RETV : TRUE - ¸ÂÀ½ / FALSE - Ʋ¸² // 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 : °´Ã¼ ÀÚ¿ø ÃʱâÈ­ // PARM : N/A // RETV : N/A // PRGM : milkji, B4nFter //*--------------------------------------------------------------- inline VOID CCriticalSection::Reset() { m_bIsOpen = FALSE; }