Restructure repository to include all source folders
Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
348
Server/NFAuthTool/NFAuthServer/Nave/NFLogManager.cpp
Normal file
348
Server/NFAuthTool/NFAuthServer/Nave/NFLogManager.cpp
Normal file
@@ -0,0 +1,348 @@
|
||||
#include "Nave.h"
|
||||
#include "NFLog.h"
|
||||
#include "NFLogManager.h"
|
||||
|
||||
#include "NFThreadManager.h"
|
||||
|
||||
namespace Nave {
|
||||
|
||||
NFLogThread::NFLogThread() : m_pLogHandle(NULL), m_bCompress(TRUE),
|
||||
m_hFlush(CreateEvent(0, TRUE, FALSE, 0)),
|
||||
m_hFile(INVALID_HANDLE_VALUE), m_dwTotalWritten(0),
|
||||
m_dwMaxFileSize(MAX_FILE_SIZE)
|
||||
{
|
||||
InterlockedExchange(&m_bEnd, FALSE);
|
||||
}
|
||||
|
||||
NFLogThread::~NFLogThread()
|
||||
{
|
||||
if(INVALID_HANDLE_VALUE != m_hFile)
|
||||
{
|
||||
CloseHandle(m_hFile);
|
||||
m_hFile = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
if(0 != m_hFlush)
|
||||
{
|
||||
CloseHandle(m_hFlush);
|
||||
m_hFlush = 0;
|
||||
}
|
||||
}
|
||||
|
||||
VOID NFLogThread::Initialize(NFLogManager* pLog, BOOL bCompress)
|
||||
{
|
||||
m_bCompress = bCompress;
|
||||
m_pLogHandle = pLog;
|
||||
}
|
||||
|
||||
unsigned int NFLogThread::Run()
|
||||
{
|
||||
// <20><><EFBFBD>⼭ m_bEnd<6E><64> TRUE<55><45> <20>ƴϸ<C6B4> <20><><EFBFBD><EFBFBD><EFBFBD>尡 <20>۵<EFBFBD><DBB5>ϰ<EFBFBD> <20>ִ<EFBFBD>.
|
||||
for(;TRUE != InterlockedCompareExchange(&m_bEnd, TRUE, TRUE);)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20>̺<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD≯<EFBFBD> 1<>ʰ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ٽ<EFBFBD> Ȯ<><C8AE>.
|
||||
if(WAIT_TIMEOUT == WaitForSingleObject(m_hFlush, 1000))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
WriteLog();
|
||||
};
|
||||
|
||||
WriteLog();
|
||||
return 0;
|
||||
}
|
||||
|
||||
BOOL NFLogThread::End()
|
||||
{
|
||||
InterlockedExchange(&m_bEnd, TRUE);
|
||||
SetEvent(m_hFlush);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL NFLogThread::WriteLog()
|
||||
{
|
||||
// <20>α<CEB1><D7BF><EFBFBD> <20><><EFBFBD>۸<EFBFBD> <20>о<EFBFBD><D0BE>´<EFBFBD>.
|
||||
if(!m_pLogHandle)
|
||||
return FALSE;
|
||||
|
||||
m_pLogHandle->SpliceInWriteBuffer(m_WriteBufferList);
|
||||
|
||||
if(m_WriteBufferList.empty())
|
||||
return TRUE;
|
||||
|
||||
if(INVALID_HANDLE_VALUE == m_hFile)
|
||||
{
|
||||
SetLogFileName();
|
||||
m_hFile = CreateFileW(m_szLogFileName, GENERIC_WRITE,
|
||||
FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
|
||||
if(INVALID_HANDLE_VALUE == m_hFile)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long dwWritten = 0;
|
||||
|
||||
for(NFLogBuffer::List::iterator itr = m_WriteBufferList.begin();
|
||||
itr != m_WriteBufferList.end(); ++itr)
|
||||
{
|
||||
NFLogBuffer* pLogBuffer = *itr;
|
||||
if(FALSE == WriteFile(m_hFile, pLogBuffer->m_Buffer, pLogBuffer->m_dwUsage, &dwWritten, 0))
|
||||
{
|
||||
LOG_ERROR((L"<EFBFBD>α<EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD>Ͽ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>. ErrorNum : %d, FileHandle:0x%p, <20><><EFBFBD><EFBFBD> ũ<><C5A9>:%d",
|
||||
GetLastError(), m_hFile, pLogBuffer->m_dwUsage));
|
||||
}
|
||||
|
||||
m_dwTotalWritten += dwWritten;
|
||||
}
|
||||
|
||||
m_pLogHandle->SpliceInFreeBuffer(m_WriteBufferList);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
if(m_dwTotalWritten > m_dwMaxFileSize)
|
||||
{
|
||||
if(INVALID_HANDLE_VALUE != m_hFile) { CloseHandle(m_hFile); m_hFile = INVALID_HANDLE_VALUE; } // <20><><EFBFBD><EFBFBD> <20>ݰ<EFBFBD>...
|
||||
|
||||
m_dwTotalWritten = 0;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL NFLogThread::SetLogFileName()
|
||||
{
|
||||
SYSTEMTIME sysTime;
|
||||
GetLocalTime(&sysTime);
|
||||
|
||||
unsigned long dwSpinCount = 0;
|
||||
WCHAR szProgramName[MAX_PATH];
|
||||
WCHAR szLogFilePrefix[MAX_PATH];
|
||||
|
||||
// <20><><EFBFBD>α<CEB1><D7B7≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ѵ<EFBFBD>.
|
||||
Nave::GetProgramName(szProgramName, MAX_PATH);
|
||||
|
||||
if(m_pLogHandle)
|
||||
_snwprintf(szLogFilePrefix, MAX_PATH - 1, L"%s", m_pLogHandle->GetLogFilePrefix());
|
||||
else
|
||||
wcsncpy(szLogFilePrefix, szProgramName, MAX_PATH);
|
||||
|
||||
if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(szProgramName))
|
||||
{
|
||||
if (!CreateDirectoryW(szProgramName, 0))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
while (TRUE)
|
||||
{
|
||||
int LogLen = _snwprintf(m_szLogFileName, MAX_PATH,
|
||||
L"%s\\%s-%04d%02d%02d-%02d%02d%02d-%04d.log",
|
||||
szProgramName, szLogFilePrefix, sysTime.wYear, sysTime.wMonth, sysTime.wDay,
|
||||
sysTime.wHour, sysTime.wMinute, sysTime.wSecond, dwSpinCount);
|
||||
|
||||
if(LogLen <= 0)
|
||||
{
|
||||
LOG_ERROR((L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<CEB1> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (INVALID_FILE_ATTRIBUTES == GetFileAttributesW(m_szLogFileName))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
++dwSpinCount;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
NFLogManager::NFLogManager(void) : m_lpDetailBuffer(0)
|
||||
{
|
||||
}
|
||||
|
||||
NFLogManager::~NFLogManager(void)
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
BOOL NFLogManager::Initialize(BOOL bCompress, const WCHAR* szLogFilePrefix)
|
||||
{
|
||||
WCHAR strName[MAX_PATH];
|
||||
Nave::GetProgramName(strName, MAX_PATH);
|
||||
wcsncpy(m_szLogFilePrefix, strName, MAX_PATH);
|
||||
|
||||
if(szLogFilePrefix != 0)
|
||||
{
|
||||
wcscat(m_szLogFilePrefix, szLogFilePrefix);
|
||||
}
|
||||
|
||||
// ó<><C3B3><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŭ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
for(int nCount = 0; nCount < DEFAULT_FREE_LOG_BUFFER_NUM; ++nCount)
|
||||
{
|
||||
NFLogBuffer* pDetailBuffer = new NFLogBuffer;
|
||||
if(0 == pDetailBuffer)
|
||||
{
|
||||
LOG_ERROR((L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD> <20><><EFBFBD>۸<EFBFBD> <20>Ҵ<EFBFBD><D2B4>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>"));
|
||||
Destroy();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
m_FreeList.push_back(pDetailBuffer);
|
||||
};
|
||||
|
||||
// <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>켱 1<><31> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
if(m_lpDetailBuffer == 0)
|
||||
{
|
||||
m_lpDetailBuffer = GetBuffer();
|
||||
}
|
||||
|
||||
m_LogSaveThread.Initialize(this, bCompress);
|
||||
|
||||
if(INVALID_HANDLE_VALUE == NFThreadManager::Run(&m_LogSaveThread))
|
||||
{
|
||||
LOG_ERROR((L"Flush<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>带 <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>ϴ<EFBFBD>"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL NFLogManager::Destroy()
|
||||
{
|
||||
Flush();
|
||||
NFThreadManager::Stop(&m_LogSaveThread, INFINITE);
|
||||
|
||||
// <20><>ũ<EFBFBD>Ǵ<EFBFBD>.
|
||||
NFSyncLock CL(&m_LogSync);
|
||||
|
||||
NFLogBuffer* pDetailBuffer;
|
||||
for(NFLogBuffer::List::iterator itr = m_FreeList.begin(); itr != m_FreeList.end(); ++itr)
|
||||
{
|
||||
pDetailBuffer = (*itr);
|
||||
_DELETE(pDetailBuffer);
|
||||
}
|
||||
m_FreeList.clear();
|
||||
|
||||
for(NFLogBuffer::List::iterator itr = m_WriteList.begin(); itr != m_WriteList.end(); ++itr)
|
||||
{
|
||||
pDetailBuffer = (*itr);
|
||||
_DELETE(pDetailBuffer);
|
||||
}
|
||||
m_WriteList.clear();
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
VOID NFLogManager::SetLogMaxSize(DWORD dwSize)
|
||||
{
|
||||
m_LogSaveThread.SetLogMaxSize(dwSize);
|
||||
}
|
||||
|
||||
NFLogBuffer* NFLogManager::GetBuffer()
|
||||
{
|
||||
// <20><>ũ<EFBFBD>Ǵ<EFBFBD>.
|
||||
NFSyncLock CL(&m_LogSync);
|
||||
|
||||
NFLogBuffer* pLogBuffer = 0;
|
||||
if(m_FreeList.empty())
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> <20><><EFBFBD>۰<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ǽð<C7BD><C3B0><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD>. <20><>¿<EFBFBD><C2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
pLogBuffer = new NFLogBuffer;
|
||||
}
|
||||
else
|
||||
{
|
||||
pLogBuffer = m_FreeList.front();
|
||||
m_FreeList.pop_front();
|
||||
}
|
||||
|
||||
if(0 == pLogBuffer)
|
||||
{
|
||||
LOG_ERROR((L"<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>α<EFBFBD> <20><><EFBFBD>۸<EFBFBD> <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>."));
|
||||
return 0;
|
||||
}
|
||||
|
||||
pLogBuffer->Initialize();
|
||||
return pLogBuffer;
|
||||
};
|
||||
|
||||
BOOL NFLogManager::Flush()
|
||||
{
|
||||
// <20><><EFBFBD>۸<EFBFBD> <20>ִ´<D6B4>.
|
||||
PushBuffer(&m_lpDetailBuffer);
|
||||
return m_LogSaveThread.FlushSignal();
|
||||
}
|
||||
|
||||
char* NFLogManager::ReserveBuffer(unsigned short usReserve)
|
||||
{
|
||||
NFSyncLock CL(&m_LogSync);
|
||||
|
||||
if(0 == m_lpDetailBuffer)
|
||||
{
|
||||
m_lpDetailBuffer = GetBuffer();
|
||||
}
|
||||
|
||||
if(NFLogBuffer::MAX_LOG_BUFFER < m_lpDetailBuffer->m_dwUsage + usReserve)
|
||||
{
|
||||
Flush(); // <20><><EFBFBD>۰<EFBFBD> <20><>á<EFBFBD><C3A1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ض<EFBFBD>.
|
||||
m_lpDetailBuffer = GetBuffer();
|
||||
}
|
||||
|
||||
if(0 == m_lpDetailBuffer)
|
||||
{
|
||||
LOG_ERROR((L"<EFBFBD>α<EFBFBD> <20><><EFBFBD>۰<EFBFBD> 0<>Դϴ<D4B4>."));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD>ø<EFBFBD>Ʈ<EFBFBD><C6AE> <20><><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD> <20>ش翵<D8B4><E7BFB5><EFBFBD><EFBFBD> Ȯ<><C8AE><EFBFBD>Ѵ<EFBFBD>.
|
||||
char* pPoint = &m_lpDetailBuffer->m_Buffer[m_lpDetailBuffer->m_dwUsage];
|
||||
Complete(usReserve);
|
||||
return pPoint;
|
||||
}
|
||||
|
||||
VOID NFLogManager::SpliceInWriteBuffer(NFLogBuffer::List& logBufferList)
|
||||
{
|
||||
NFSyncLock CL(&m_LogSync);
|
||||
|
||||
if(m_WriteList.empty())
|
||||
return;
|
||||
|
||||
// WriteBuffer <20><> <20><><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>.
|
||||
logBufferList.splice(logBufferList.end(), m_WriteList);
|
||||
}
|
||||
|
||||
VOID NFLogManager::SpliceInFreeBuffer(NFLogBuffer::List& logBufferList)
|
||||
{
|
||||
NFSyncLock CL(&m_LogSync);
|
||||
|
||||
if(logBufferList.empty())
|
||||
return;
|
||||
|
||||
m_FreeList.splice(m_FreeList.end(), logBufferList);
|
||||
}
|
||||
|
||||
VOID NFLogManager::PushBuffer(NFLogBuffer** ppDetailBuffer)
|
||||
{
|
||||
if(0 == *ppDetailBuffer) { return; }
|
||||
|
||||
NFSyncLock CL(&m_LogSync);
|
||||
|
||||
if(0 == (*ppDetailBuffer)->m_dwUsage)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD> 0<>̴<EFBFBD> <20>ٽ<EFBFBD> Free<65><65> <20><><EFBFBD><EFBFBD>.
|
||||
m_FreeList.push_back(*ppDetailBuffer);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_WriteList.push_back(*ppDetailBuffer);
|
||||
}
|
||||
|
||||
// <20>̺κ<CCBA> <20>빮<EFBFBD><EBB9AE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
*ppDetailBuffer = 0;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user