DragonNest/Server/ServiceMonitorEx/Source/LockBase.hpp

550 lines
14 KiB
C++
Raw Permalink Normal View History

2024-12-19 09:48:26 +08:00
/*//===============================================================
<< LOCK-BASE >>
PRGM : B4nFter
FILE : LOCKBASE.HPP
DESC : Lock Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> Ŭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
INIT BUILT DATE : 2007. 03. 12
LAST BUILT DATE : 2007. 07. 15
Copyright<EFBFBD><EFBFBD> 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 <20>⺻ Ŭ<><C5AC><EFBFBD><EFBFBD>
// 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 <20>Ļ<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
class CLockAuto
{
DISABLE_COPY_ASSIGN(CLockAuto) // <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
public:
explicit CLockAuto(const CLockBase& lpLock);
explicit CLockAuto(const CLockBase* lpLock);
~CLockAuto();
private:
const CLockBase* m_lpLock;
};
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CLockAutoEx
//*---------------------------------------------------------------
// DESC : Lock() / Unlock() <20>޼<EFBFBD><DEBC><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TLOCK Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> (<28><><EFBFBD>ø<EFBFBD>)
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
class CLockAutoEx
{
// DISABLE_COPY_ASSIGN(CLockAutoEx) // <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
public:
explicit CLockAutoEx(const TLOCK& pLock);
explicit CLockAutoEx(const TLOCK* pLock);
~CLockAutoEx();
private:
// <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CLockAutoEx(const CLockAutoEx<TLOCK>& pLock) : m_lpLock(pLock.m_lpLock) { }
#pragma warning (disable:4100)
CLockAutoEx& operator=(const CLockAutoEx<TLOCK>& pLock) { return(*this); }
#pragma warning (default:4100)
private:
const TLOCK* m_lpLock;
};
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CUnlockAuto
//*---------------------------------------------------------------
// DESC : CLockBase <20>Ļ<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
class CUnlockAuto
{
DISABLE_COPY_ASSIGN(CUnlockAuto) // <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
public:
explicit CUnlockAuto(const CLockBase& lpLock);
explicit CUnlockAuto(const CLockBase* lpLock);
~CUnlockAuto();
private:
const CLockBase* m_lpLock;
};
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CUnlockAutoEx
//*---------------------------------------------------------------
// DESC : Unlock() <20>޼<EFBFBD><DEBC><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TLOCK Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
class CUnlockAutoEx
{
// DISABLE_COPY_ASSIGN(CUnlockAutoEx) // <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
public:
explicit CUnlockAutoEx(const TLOCK& pLock);
explicit CUnlockAutoEx(const TLOCK* pLock);
~CUnlockAutoEx();
private:
// <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CUnlockAutoEx(const CUnlockAutoEx<TLOCK>& pLock) : m_lpLock(pLock.m_lpLock) { }
#pragma warning (disable:4100)
CUnlockAutoEx& operator=(const CUnlockAutoEx<TLOCK>& pLock) { return(*this); }
#pragma warning (default:4100)
private:
const TLOCK* m_lpLock;
};
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CUnlockUndo
//*---------------------------------------------------------------
// DESC : CLockBase <20>Ļ<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
class CUnlockUndo
{
DISABLE_COPY_ASSIGN(CUnlockUndo) // <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
public:
explicit CUnlockUndo(const CLockBase& lpLock);
explicit CUnlockUndo(const CLockBase* lpLock);
~CUnlockUndo();
private:
const CLockBase* m_lpLock;
};
//*---------------------------------------------------------------
// TYPE : CLASS
// NAME : CUnlockUndoEx
//*---------------------------------------------------------------
// DESC : Lock() / Unlock() <20>޼<EFBFBD><DEBC><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TLOCK Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20>ڵ<EFBFBD> <20><><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Ŭ<><C5AC><EFBFBD><EFBFBD> (<28><><EFBFBD>ø<EFBFBD>)
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
class CUnlockUndoEx
{
// DISABLE_COPY_ASSIGN(CUnlockUndoEx) // <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
public:
explicit CUnlockUndoEx(const TLOCK& pLock);
explicit CUnlockUndoEx(const TLOCK* pLock);
~CUnlockUndoEx();
private:
// <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
CUnlockUndoEx(const CUnlockUndoEx<TLOCK>& pLock) : m_lpLock(pLock.m_lpLock) { }
#pragma warning (disable:4100)
CUnlockUndoEx& operator=(const CUnlockUndoEx<TLOCK>& pLock) { return(*this); }
#pragma warning (default:4100)
private:
const TLOCK* m_lpLock;
};
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLockBase::CLockBase
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline CLockBase::CLockBase() : m_bIsOpen(NULL)
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLockAuto::CLockAuto
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . lpLock - CLockBase <20><> <20>Ļ<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>
// 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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . lpLock - CLockBase <20><> <20>Ļ<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 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 : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// 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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . pLock - TLOCK Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
inline CLockAutoEx<TLOCK>::CLockAutoEx(const TLOCK& pLock) : m_lpLock(&pLock)
{
if (m_lpLock)
{
m_lpLock->Lock();
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLockAutoEx::CLockAutoEx
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . pLock - TLOCK Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
inline CLockAutoEx<TLOCK>::CLockAutoEx(const TLOCK* pLock) : m_lpLock(pLock)
{
if (m_lpLock)
{
m_lpLock->Lock();
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CLockAutoEx::~CLockAutoEx
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
inline CLockAutoEx<TLOCK>::~CLockAutoEx()
{
if (m_lpLock) {
m_lpLock->Unlock();
m_lpLock = NULL;
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CUnlockAuto::CUnlockAuto
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . lpLock - CLockBase <20><> <20>Ļ<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline CUnlockAuto::CUnlockAuto(const CLockBase& lpLock) : m_lpLock(&lpLock)
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CUnlockAuto::CUnlockAuto
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . lpLock - CLockBase <20><> <20>Ļ<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
inline CUnlockAuto::CUnlockAuto(const CLockBase* lpLock) : m_lpLock(lpLock)
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CUnlockAuto::~CUnlockAuto
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// 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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . pLock - TLOCK Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
inline CUnlockAutoEx<TLOCK>::CUnlockAutoEx(const TLOCK& pLock) : m_lpLock(&pLock)
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CUnlockAutoEx::CUnlockAutoEx
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . pLock - TLOCK Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
inline CUnlockAutoEx<TLOCK>::CUnlockAutoEx(const TLOCK* pLock) : m_lpLock(pLock)
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CUnlockAutoEx::~CUnlockAutoEx
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
inline CUnlockAutoEx<TLOCK>::~CUnlockAutoEx()
{
if (m_lpLock) {
m_lpLock->Unlock();
m_lpLock = NULL;
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CUnlockUndo::CUnlockUndo
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . lpLock - CLockBase <20><> <20>Ļ<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>
// 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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . lpLock - CLockBase <20><> <20>Ļ<EFBFBD>Ŭ<EFBFBD><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 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 : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// 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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . pLock - TLOCK Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
inline CUnlockUndoEx<TLOCK>::CUnlockUndoEx(const TLOCK& pLock) : m_lpLock(&pLock)
{
if (m_lpLock)
{
m_lpLock->Unlock();
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CUnlockUndoEx::CUnlockUndoEx
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . pLock - TLOCK Ŭ<><C5AC><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
inline CUnlockUndoEx<TLOCK>::CUnlockUndoEx(const TLOCK* pLock) : m_lpLock(pLock)
{
if (m_lpLock) {
m_lpLock->Unlock();
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CUnlockUndoEx::~CUnlockUndoEx
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
template<class TLOCK>
inline CUnlockUndoEx<TLOCK>::~CUnlockUndoEx()
{
if (m_lpLock) {
m_lpLock->Lock();
m_lpLock = NULL;
}
}