DragonNest/Common/Utility/Access.cpp
Cussrro 47f7895977 Revert "修复编码问题"
This reverts commit 9e69c01767.
2024-12-21 10:04:04 +08:00

327 lines
5.1 KiB
C++

#include "STDAFX.H"
#include "ACCESS.H"
#include "COMMONMACROS.H"
#include "BASESET.H"
#include "DEBUGUTIL.H"
#include "SAFESTRINGMACROS.H"
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#if defined(_DEBUG)
CAccess::TP_DEBUGLIST CAccess::m_Debug;
//MODE_DBG(CAccess::TP_DEBUGLIST CAccess::m_Debug;);
CAccess::TP_LOCK CAccess::m_DebugLock;
//MODE_DBG(CAccess::TP_LOCK CAccess::m_DebugLock);
#endif // _DEBUG
CAccess::CAccess() : m_dwAccessCount(0), m_bEnable(FALSE), m_bOpen(FALSE)
{
}
CAccess::~CAccess()
{
Close();
}
DWORD CAccess::Open(BOOL pDoEnable)
{
DN_ASSERT(!IsOpen(), "Alrady Opened!");
#if defined(_DEBUG)
// DN_ASSERT(m_DebugLock.IsOpen(), "Invalid!"); // CAccess::OpenDebug() 가 먼저 호출되어야 함
#endif // _DEBUG
m_dwAccessCount = 0;
m_bEnable = pDoEnable; // !!! 임시 → 나중에 접근단계 플래그로 바뀌어야 함
m_bOpen = TRUE;
/*
DWORD dwRetVal = m_Lock.Open();
if (NOERROR != dwRetVal) {
DN_RETURN(dwRetVal);
}
*/
return NOERROR;
}
VOID CAccess::Close()
{
// DN_ASSERT(IsOpen(), "Not Opened!");
m_bEnable = FALSE; // !!! 임시 → 나중에 접근단계 플래그로 바뀌어야 함
m_bOpen = FALSE;
// m_Lock.Close();
}
VOID CAccess::Reset()
{
DN_ASSERT(IsOpen(), "Not Opened!");
DN_ASSERT(!m_Lock.IsLock(), "Invalid!");
TP_LOCKAUTO aLockAuto(m_Lock);
ResetNoLock();
}
VOID CAccess::ResetNoLock()
{
DN_ASSERT(IsOpen(), "Not Opened!");
DN_ASSERT(1 > m_dwAccessCount, "Invalid!");
m_bEnable = TRUE;
m_dwAccessCount = 0;
}
DWORD CAccess::GetAccessCount() const
{
DN_ASSERT(IsOpen(), "Not Opened!");
DN_ASSERT(!m_Lock.IsLock(), "Invalid!");
TP_LOCKAUTO aLockAuto(m_Lock);
return(GetAccessCountNoLock());
}
DWORD CAccess::GetAccessCountNoLock() const
{
DN_ASSERT(IsOpen(), "Not Opened!");
DN_ASSERT(m_Lock.IsLock(), "Invalid!");
return(m_dwAccessCount);
}
BOOL CAccess::CanAttach()
{
DN_ASSERT(IsOpen(), "Not Opened!");
DN_ASSERT(!m_Lock.IsLock(), "Invalid!");
TP_LOCKAUTO aLockAuto(m_Lock);
return(CanAttachNoLock());
}
BOOL CAccess::CanAttachNoLock()
{
DN_ASSERT(IsOpen(), "Not Opened!");
DN_ASSERT(m_Lock.IsLock(), "Invalid!");
return(m_bEnable == TRUE);
}
BOOL CAccess::Attach()
{
DN_ASSERT(IsOpen(), "Not Opened!");
BOOL bRetVal = FALSE;
TP_LOCKAUTO aLockAuto(m_Lock);
if (CanAttachNoLock()) {
bRetVal = TRUE;
AttachMain();
}
return(bRetVal);
}
/*
BOOL CAccess::AttachTry()
{
DN_ASSERT(IsOpen(), "Not Opened!");
BOOL bRetVal = FALSE;
if (m_Lock.LockTry()) {
if (CanAttachNoLock()) {
bRetVal = TRUE;
AttachMain();
}
m_Lock.UnLock();
}
return(bRetVal);
}
*/
VOID CAccess::AttachMust()
{
DN_ASSERT(IsOpen(), "Not Opened!");
TP_LOCKAUTO aLockAuto(m_Lock);
AttachMain();
}
BOOL CAccess::Detach()
{
DN_ASSERT(IsOpen(), "Not Opened!");
BOOL bRetVal = FALSE;
TP_LOCKAUTO aLockAuto(m_Lock);
DetachMain();
if (FALSE == m_bEnable) {
if (1 > m_dwAccessCount) {
m_bEnable = FALSE;
bRetVal = (0 == m_dwAccessCount); // 중복처리 방지 위해 0 일 때만 TRUE
}
}
return(bRetVal);
}
BOOL CAccess::DetachMust()
{
DN_ASSERT(IsOpen(), "Not Opened!");
BOOL bRetVal = FALSE;
TP_LOCKAUTO aLockAuto(m_Lock);
if (0 < m_dwAccessCount) { // 중복처리 방지위해 0 이상일 때만 처리
m_dwAccessCount = 0;
m_bEnable = FALSE;
bRetVal = TRUE;
}
return(bRetVal);
}
VOID CAccess::AttachMain()
{
DN_ASSERT(IsOpen(), "Not Opened!");
++m_dwAccessCount;
#if defined(_DEBUG)
{
DWORD aThreadId = ::GetCurrentThreadId();
TP_LOCKAUTO aLockAuto(m_DebugLock);
TP_DEBUGLIST_ITR aIt = m_Debug.find(aThreadId);
if (m_Debug.end() == aIt) {
std::pair<TP_DEBUGLIST_ITR, bool> RetVal = m_Debug.insert(TP_DEBUGLIST::value_type(aThreadId, 0));
DN_ASSERT(RetVal.second, "Check!");
aIt = RetVal.first;
}
DN_ASSERT(++(aIt->second) < DF_DEBUG_COUNT, "After Call Attach(), Call Detach() Immediatly After Using is Over !!!");
}
#endif // _DEBUG
}
VOID CAccess::DetachMain()
{
DN_ASSERT(IsOpen(), "Not Opened!");
--m_dwAccessCount;
#if defined(_DEBUG)
{
DWORD aThreadId = ::GetCurrentThreadId();
TP_LOCKAUTO aLockAuto(m_DebugLock);
TP_DEBUGLIST_ITR aIt = m_Debug.find(aThreadId);
if (m_Debug.end() != aIt) {
--(aIt->second);
}
}
#endif // _DEBUG
}
VOID CAccess::DisableAttach()
{
DN_ASSERT(IsOpen(), "Not Opened!");
TP_LOCKAUTO aLockAuto(m_Lock);
DisableAttachNoLock();
}
VOID CAccess::DisableAttachNoLock()
{
DN_ASSERT(IsOpen(), "Not Opened!");
m_bEnable = FALSE;
}
VOID CAccess::Lock() const
{
DN_ASSERT(IsOpen(), "Not Opened!");
m_Lock.Lock();
}
VOID CAccess::Unlock() const
{
DN_ASSERT(IsOpen(), "Not Opened!");
m_Lock.UnLock();
}
/*
BOOL CAccess::LockTry() const
{
DN_ASSERT(IsOpen(), "Not Opened!");
return m_Lock.LockTry();
}
*/
#if defined(_DEBUG)
BOOL CAccess::IsLock() const
{
DN_ASSERT(IsOpen(), "Not Opened!");
return((m_Lock.IsLock())?(TRUE):(FALSE));
}
DWORD CAccess::OpenDebug()
{
/*
DWORD dwRetVal = m_DebugLock.Open();
if (NOERROR != dwRetVal) {
DN_RETURN(HASERROR+0);
}
*/
return NOERROR;
}
DWORD CAccess::GetAccessCountByThread()
{
TP_LOCKAUTO aLockAuto(m_DebugLock);
return(m_Debug[::GetCurrentThreadId()]);
}
#endif // _DEBUG