/*//=============================================================== << LOCK-BASE >> PRGM : B4nFter FILE : LOCKBASE.HPP DESC : Lock Ŭ·¡½ºÀÇ ±âº», °ü¸® Ŭ·¡½º INIT BUILT DATE : 2007. 03. 12 LAST BUILT DATE : 2007. 07. 15 Copyright¨Ï 2002~2009 B4nFter (b4nfter@gmail.com) and Co-Writers. All Rights Reserved. *///=============================================================== #pragma once /////////////////////////////////////////////////////////////////// // INCLUDE /////////////////////////////////////////////////////////////////// #include "SYSBASEBASE.H" /////////////////////////////////////////////////////////////////// // DEFINE /////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////// // DECLARATION /////////////////////////////////////////////////////////////////// //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CLockBase //*--------------------------------------------------------------- // DESC : Lock ±âº» Ŭ·¡½º // PRGM : B4nFter //*--------------------------------------------------------------- class CLockBase { public: CLockBase(); virtual ~CLockBase() { } virtual BOOL IsOpen() const = 0; virtual VOID Lock(BOOL bDoCheck = FALSE) const = 0; virtual VOID Unlock() const = 0; #if defined(_DEBUG) virtual BOOL IsLock() const = 0; #endif // #if defined(_DEBUG) protected: BOOL m_bIsOpen; }; //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CLockAuto //*--------------------------------------------------------------- // DESC : CLockBase ÆÄ»ýŬ·¡½ºÀÇ ÀÚµ¿ Àá±Ý/ÇØÁ¦ °ü¸® Ŭ·¡½º // PRGM : B4nFter //*--------------------------------------------------------------- class CLockAuto { DISABLE_COPY_ASSIGN(CLockAuto) // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö public: explicit CLockAuto(const CLockBase& lpLock); explicit CLockAuto(const CLockBase* lpLock); ~CLockAuto(); private: const CLockBase* m_lpLock; }; //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CLockAutoEx //*--------------------------------------------------------------- // DESC : Lock() / Unlock() ¸Þ¼­µå¸¦ ±¸ÇöÇÑ TLOCK Ŭ·¡½º °´Ã¼ÀÇ ÀÚµ¿ Àá±Ý/ÇØÁ¦ °ü¸® Ŭ·¡½º (ÅÛÇø´) // PRGM : B4nFter //*--------------------------------------------------------------- template class CLockAutoEx { // DISABLE_COPY_ASSIGN(CLockAutoEx) // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö public: explicit CLockAutoEx(const TLOCK& pLock); explicit CLockAutoEx(const TLOCK* pLock); ~CLockAutoEx(); private: // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö CLockAutoEx(const CLockAutoEx& pLock) : m_lpLock(pLock.m_lpLock) { } #pragma warning (disable:4100) CLockAutoEx& operator=(const CLockAutoEx& pLock) { return(*this); } #pragma warning (default:4100) private: const TLOCK* m_lpLock; }; //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CUnlockAuto //*--------------------------------------------------------------- // DESC : CLockBase ÆÄ»ýŬ·¡½ºÀÇ ÀÚµ¿ ÇØÁ¦ °ü¸® Ŭ·¡½º // PRGM : B4nFter //*--------------------------------------------------------------- class CUnlockAuto { DISABLE_COPY_ASSIGN(CUnlockAuto) // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö public: explicit CUnlockAuto(const CLockBase& lpLock); explicit CUnlockAuto(const CLockBase* lpLock); ~CUnlockAuto(); private: const CLockBase* m_lpLock; }; //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CUnlockAutoEx //*--------------------------------------------------------------- // DESC : Unlock() ¸Þ¼­µå¸¦ ±¸ÇöÇÑ TLOCK Ŭ·¡½º °´Ã¼ÀÇ ÀÚµ¿ ÇØÁ¦ °ü¸® Ŭ·¡½º // PRGM : B4nFter //*--------------------------------------------------------------- template class CUnlockAutoEx { // DISABLE_COPY_ASSIGN(CUnlockAutoEx) // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö public: explicit CUnlockAutoEx(const TLOCK& pLock); explicit CUnlockAutoEx(const TLOCK* pLock); ~CUnlockAutoEx(); private: // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö CUnlockAutoEx(const CUnlockAutoEx& pLock) : m_lpLock(pLock.m_lpLock) { } #pragma warning (disable:4100) CUnlockAutoEx& operator=(const CUnlockAutoEx& pLock) { return(*this); } #pragma warning (default:4100) private: const TLOCK* m_lpLock; }; //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CUnlockUndo //*--------------------------------------------------------------- // DESC : CLockBase ÆÄ»ýŬ·¡½ºÀÇ ÀÚµ¿ ÇØÁ¦/Àá±Ý °ü¸® Ŭ·¡½º // PRGM : B4nFter //*--------------------------------------------------------------- class CUnlockUndo { DISABLE_COPY_ASSIGN(CUnlockUndo) // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö public: explicit CUnlockUndo(const CLockBase& lpLock); explicit CUnlockUndo(const CLockBase* lpLock); ~CUnlockUndo(); private: const CLockBase* m_lpLock; }; //*--------------------------------------------------------------- // TYPE : CLASS // NAME : CUnlockUndoEx //*--------------------------------------------------------------- // DESC : Lock() / Unlock() ¸Þ¼­µå¸¦ ±¸ÇöÇÑ TLOCK Ŭ·¡½º °´Ã¼ÀÇ ÀÚµ¿ ÇØÁ¦/Àá±Ý °ü¸® Ŭ·¡½º (ÅÛÇø´) // PRGM : B4nFter //*--------------------------------------------------------------- template class CUnlockUndoEx { // DISABLE_COPY_ASSIGN(CUnlockUndoEx) // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö public: explicit CUnlockUndoEx(const TLOCK& pLock); explicit CUnlockUndoEx(const TLOCK* pLock); ~CUnlockUndoEx(); private: // °´Ã¼°£ º¹»ç, ´ëÀÔ ±ÝÁö CUnlockUndoEx(const CUnlockUndoEx& pLock) : m_lpLock(pLock.m_lpLock) { } #pragma warning (disable:4100) CUnlockUndoEx& operator=(const CUnlockUndoEx& pLock) { return(*this); } #pragma warning (default:4100) private: const TLOCK* m_lpLock; }; /////////////////////////////////////////////////////////////////// // IMPLEMENTATION /////////////////////////////////////////////////////////////////// //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CLockBase::CLockBase //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CLockBase::CLockBase() : m_bIsOpen(NULL) { } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CLockAuto::CLockAuto //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . lpLock - CLockBase ÀÇ ÆÄ»ýŬ·¡½º °´Ã¼ÂüÁ¶ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CLockAuto::CLockAuto(const CLockBase& lpLock) : m_lpLock(&lpLock) { if (m_lpLock) { m_lpLock->Lock(); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CLockAuto::CLockAuto //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . lpLock - CLockBase ÀÇ ÆÄ»ýŬ·¡½º °´Ã¼Æ÷ÀÎÅÍ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CLockAuto::CLockAuto(const CLockBase* lpLock) : m_lpLock(lpLock) { if (m_lpLock) { m_lpLock->Lock(); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CLockAuto::~CLockAuto //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CLockAuto::~CLockAuto() { if (m_lpLock) { m_lpLock->Unlock(); m_lpLock = NULL; } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CLockAutoEx::CLockAutoEx //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . pLock - TLOCK Ŭ·¡½º °´Ã¼ÂüÁ¶ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CLockAutoEx::CLockAutoEx(const TLOCK& pLock) : m_lpLock(&pLock) { if (m_lpLock) { m_lpLock->Lock(); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CLockAutoEx::CLockAutoEx //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . pLock - TLOCK Ŭ·¡½º °´Ã¼Æ÷ÀÎÅÍ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CLockAutoEx::CLockAutoEx(const TLOCK* pLock) : m_lpLock(pLock) { if (m_lpLock) { m_lpLock->Lock(); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CLockAutoEx::~CLockAutoEx //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CLockAutoEx::~CLockAutoEx() { if (m_lpLock) { m_lpLock->Unlock(); m_lpLock = NULL; } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockAuto::CUnlockAuto //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . lpLock - CLockBase ÀÇ ÆÄ»ýŬ·¡½º °´Ã¼ÂüÁ¶ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CUnlockAuto::CUnlockAuto(const CLockBase& lpLock) : m_lpLock(&lpLock) { } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockAuto::CUnlockAuto //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . lpLock - CLockBase ÀÇ ÆÄ»ýŬ·¡½º °´Ã¼Æ÷ÀÎÅÍ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CUnlockAuto::CUnlockAuto(const CLockBase* lpLock) : m_lpLock(lpLock) { } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockAuto::~CUnlockAuto //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CUnlockAuto::~CUnlockAuto() { if (m_lpLock) { m_lpLock->Unlock(); m_lpLock = NULL; } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockAutoEx::CUnlockAutoEx //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . pLock - TLOCK Ŭ·¡½º °´Ã¼ÂüÁ¶ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CUnlockAutoEx::CUnlockAutoEx(const TLOCK& pLock) : m_lpLock(&pLock) { } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockAutoEx::CUnlockAutoEx //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . pLock - TLOCK Ŭ·¡½º °´Ã¼Æ÷ÀÎÅÍ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CUnlockAutoEx::CUnlockAutoEx(const TLOCK* pLock) : m_lpLock(pLock) { } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockAutoEx::~CUnlockAutoEx //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CUnlockAutoEx::~CUnlockAutoEx() { if (m_lpLock) { m_lpLock->Unlock(); m_lpLock = NULL; } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockUndo::CUnlockUndo //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . lpLock - CLockBase ÀÇ ÆÄ»ýŬ·¡½º °´Ã¼ÂüÁ¶ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CUnlockUndo::CUnlockUndo(const CLockBase& lpLock) : m_lpLock(&lpLock) { if (m_lpLock) { m_lpLock->Unlock(); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockUndo::CUnlockUndo //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . lpLock - CLockBase ÀÇ ÆÄ»ýŬ·¡½º °´Ã¼Æ÷ÀÎÅÍ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CUnlockUndo::CUnlockUndo(const CLockBase* lpLock) : m_lpLock(lpLock) { if (m_lpLock) { m_lpLock->Unlock(); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockUndo::~CUnlockUndo //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- inline CUnlockUndo::~CUnlockUndo() { if (m_lpLock) { m_lpLock->Lock(); m_lpLock = NULL; } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockUndoEx::CUnlockUndoEx //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . pLock - TLOCK Ŭ·¡½º °´Ã¼ÂüÁ¶ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CUnlockUndoEx::CUnlockUndoEx(const TLOCK& pLock) : m_lpLock(&pLock) { if (m_lpLock) { m_lpLock->Unlock(); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockUndoEx::CUnlockUndoEx //*--------------------------------------------------------------- // DESC : »ý¼ºÀÚ // PARM : 1 . pLock - TLOCK Ŭ·¡½º °´Ã¼Æ÷ÀÎÅÍ // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CUnlockUndoEx::CUnlockUndoEx(const TLOCK* pLock) : m_lpLock(pLock) { if (m_lpLock) { m_lpLock->Unlock(); } } //*--------------------------------------------------------------- // TYPE : FUNCTION // NAME : CUnlockUndoEx::~CUnlockUndoEx //*--------------------------------------------------------------- // DESC : ¼Ò¸êÀÚ // PARM : N/A // RETV : N/A // PRGM : B4nFter //*--------------------------------------------------------------- template inline CUnlockUndoEx::~CUnlockUndoEx() { if (m_lpLock) { m_lpLock->Lock(); m_lpLock = NULL; } }