DragonNest/Server/ServiceMonitorEx/Source/Thread.cpp

444 lines
24 KiB
C++
Raw Normal View History

2024-12-20 16:56:44 +08:00
<EFBFBD><EFBFBD>
///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "STDAFX.H"
#include "THREAD.H"
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::CThread
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD>1<EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CThread::CThread()
{
Reset();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::~CThread
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD>x<EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CThread::~CThread()
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Start
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴ|<EFBFBD> <EFBFBD>‰<EFBFBD>
// PARM : 1 . lpfnThreadProc - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD>\<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>x<EFBFBD>0<EFBFBD>
// 2 . lpParam - <EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>`<EFBFBD> <EFBFBD><EFBFBD> (0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL)
// 3 . lpszName - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD> (0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL)
// 4 . uStackSize - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>l<EFBFBD>0<EFBFBD> (0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 <EFBFBD>! 1MB)
// 5 . bSuspend - <EFBFBD><EFBFBD>1<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ŀ<EFBFBD> (0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> FALSE)
// 6 . bAutoEnd - <EFBFBD><EFBFBD≯ <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ٳ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD><EFBFBD>|<EFBFBD> `<EFBFBD><EFBFBD><EFBFBD> <EFBFBD>ŀ<EFBFBD> (0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> TRUE, FALSE |<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>Ɛ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> CThread::End() 8֜<EFBFBD>)
// 7 . m_lpPrepProc - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD>‘<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>‰<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL)
// 8 . m_lpPostProc - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD><EFBFBD≯ <EFBFBD><EFBFBD> <EFBFBD>‰<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL)
// 9 . m_lpPrepProcParam - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD>‘<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> (0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL)
// 10 . m_lpPostProcParam - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD><EFBFBD≯ <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> (0<EFBFBD><EFBFBD><EFBFBD><EFBFBD> NULL)
// RETV : TRUE - 1<EFBFBD><EFBFBD><EFBFBD> / FALSE - <EFBFBD><EFBFBD>(<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CThread::Start(
LPFN_THREAD_PROC lpfnThreadProc,
LPVOID lpParam,
LPCTSTR lpszName,
UINT uStackSize,
BOOL bSuspend,
BOOL bAutoEnd,
LPFN_PREP_PROC lpfnPrepProc,
LPFN_POST_PROC lpfnPostProc,
LPVOID lpPrepProcParam,
LPVOID lpPostProcParam
)
{
if (m_hHandle) {
return FALSE;
}
if (!lpfnThreadProc) {
return FALSE;
}
m_lpfnThreadProc = lpfnThreadProc;
m_lpParam = lpParam;
m_bAutoEnd = bAutoEnd;
m_lpfnPrepProc = lpfnPrepProc;
m_lpfnPostProc = lpfnPostProc;
m_lpPrepProcParam = lpPrepProcParam;
m_lpPostProcParam = lpPostProcParam;
if (lpszName) {
STRNCPY(m_szName, lpszName, COUNT_OF(m_szName));
}
m_hHandle = (HANDLE)::_beginthreadex(NULL, uStackSize, ThreadProc, (LPVOID)(this), (bSuspend)?(CREATE_SUSPENDED):(0), &m_uId);
if (!m_hHandle) {
return FALSE;
}
return TRUE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Reset
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>K<EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CThread::End()
{
if (DF_MEMSTATE_DDDD == (DWORD_PTR)m_hHandle) {
// HEAP <EFBFBD><EFBFBD><EFBFBD> t<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ļij <EFBFBD><EFBFBD≯ <EFBFBD>Ŵ<EFBFBD>|<EFBFBD> h<EFBFBD>
return;
}
if (m_hHandle) {
DWORD dwExitCode = 0;
::GetExitCodeThread(m_hHandle, &dwExitCode);
if (STILL_ACTIVE == dwExitCode) {
// <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD><EFBFBD≯ <EFBFBD><EFBFBD><EFBFBD>Ŕ<EFBFBD> TLS|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><<EFBFBD>\<EFBFBD> t<EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> J<EFBFBD>L<EFBFBD> (STL <EFBFBD><EFBFBD><EFBFBD><EFBFBD>t<EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> t<EFBFBD><EFBFBD>(<EFBFBD><<EFBFBD>\<EFBFBD> x<EFBFBD>\<EFBFBD> Access Violation <EFBFBD>x<EFBFBD>|<EFBFBD> <<EFBFBD>X<EFBFBD>0<EFBFBD> <EFBFBD>h<EFBFBD>, <EFBFBD>¤<EFBFBD>\<EFBFBD><EFBFBD><EFBFBD> t<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>@<EFBFBD>?)
std::set<DWORD>::iterator it = m_setTlsValue.begin();
for (; it != m_setTlsValue.end() ; ++it) {
if ((*it) != TLS_OUT_OF_INDEXES) {
::TlsFree(*it);
}
}
m_setTlsValue.clear();
}
::CloseHandle(m_hHandle);
}
Reset();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Reset
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD>K<EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CThread::Reset()
{
m_hHandle = NULL;
m_uId = 0;
m_lpfnThreadProc = NULL;
m_lpParam = NULL;
m_szName[0] = _T('\0');
m_bAutoEnd = TRUE;
m_lpfnPrepProc = NULL;
m_lpfnPostProc = NULL;
m_lpPrepProcParam = NULL;
m_lpPostProcParam = NULL;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::ThreadProc
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴX<EFBFBD> T<EFBFBD>x<EFBFBD> <EFBFBD>‰<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, CThread:m_lpfnThreadProc |<EFBFBD> <EFBFBD>‰<EFBFBD>
// PARM : 1 . lpParam - <EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>`<EFBFBD> <EFBFBD><EFBFBD>
// RETV : <EFBFBD><EFBFBD><EFBFBD>ܴX<EFBFBD> <EFBFBD><EFBFBD≯T<EFBFBD>ܴ
// PRGM : B4nFter
//*---------------------------------------------------------------
UINT __stdcall CThread::ThreadProc(LPVOID lpParam)
{
CThread* lpThread = (CThread*)lpParam;
if (!lpThread || !lpThread->m_lpfnThreadProc) {
return 0;
}
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
::_tcsncmp(lpThread->m_szName, _T(""), COUNT_OF(lpThread->m_szName))
)
{
lpThread->SetName(lpThread->m_szName);
}
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
lpThread->GetPrepProc()
)
{
lpThread->GetPrepProc()(lpThread->GetPrepProcParam());
}
UINT iRetVal = 0;
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
lpThread->m_lpfnThreadProc
)
{
iRetVal = lpThread->m_lpfnThreadProc(lpThread->GetParam());
}
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
lpThread->GetPostProc()
)
{
lpThread->GetPostProc()(lpThread->GetPostProcParam());
}
if ((DF_MEMSTATE_DDDD != ((DWORD_PTR)(lpThread->m_hHandle))) &&
lpThread->IsAutoEnd()
)
{
lpThread->End();
}
return iRetVal;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::SetName
//*---------------------------------------------------------------
// DESC : ֬<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . lpszName - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD>
// RETV : N/A
// PRGM : B4nFter
// P.S.>
// - <EFBFBD><EFBFBD><EFBFBD>ܴ|<EFBFBD> <EFBFBD><EFBFBD>1<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>|<EFBFBD> h<EFBFBD> (CThread::Start() <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> ȥ<EFBFBD>, CThread::ThreadProc() <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD>)
// - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD> \<EFBFBD><EFBFBD>”<EFBFBD> Debug <EFBFBD>! Thread <EFBFBD>T<EFBFBD>=<EFBFBD><EFBFBD><EFBFBD><EFBFBD> U<EFBFBD>x<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
//*---------------------------------------------------------------
VOID CThread::SetName(LPCTSTR lpszName)
{
SetName(lpszName, (DWORD)(-1));
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::SetName
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . lpszName - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD>
// 2 . pThreadID - <EFBFBD><EFBFBD><EFBFBD>ܴ ID
// RETV : N/A
// PRGM : B4nFter
// P.S.>
// - <EFBFBD><EFBFBD><EFBFBD>ܴ|<EFBFBD> <EFBFBD><EFBFBD>1<EFBFBD>\<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>t<EFBFBD>|<EFBFBD> h<EFBFBD> (CThread::Start() <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> ȥ<EFBFBD>, CThread::ThreadProc() <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD>)
// - <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD> \<EFBFBD><EFBFBD>”<EFBFBD> Debug <EFBFBD>! Thread <EFBFBD>T<EFBFBD>=<EFBFBD><EFBFBD><EFBFBD><EFBFBD> U<EFBFBD>x<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
//*---------------------------------------------------------------
VOID CThread::SetName(LPCTSTR lpszName, DWORD pThreadID)
{
if (!lpszName) {
BASE_RETURN_NONE;
}
USES_CONVERSION;
THREADNAMEINFO stThreadNameInfo;
stThreadNameInfo.dwType = 0x1000;
stThreadNameInfo.szName = T2CA(lpszName);
stThreadNameInfo.dwThreadID = pThreadID;
stThreadNameInfo.dwFlags = 0;
__try
{
::RaiseException(0x406D1388, 0, sizeof(THREADNAMEINFO)/sizeof(DWORD), (const ULONG_PTR*)&stThreadNameInfo);
}
__except(EXCEPTION_CONTINUE_EXECUTION)
{
NULL;
}
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::GetName
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD>D<EFBFBD> <EFBFBD>Ŵ<EFBFBD>4<EFBFBD>
// PARM : N/A
// RETV : <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
LPCTSTR CThread::GetName() const
{
return m_szName;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Suspend
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴX<EFBFBD> Suspend <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> t<EFBFBD><EFBFBD>
// PARM : N/A
// RETV : 1<EFBFBD><EFBFBD><EFBFBD>:previous suspend count / <EFBFBD><EFBFBD>(<EFBFBD>:0xFFFFFFFF
// PRGM : B4nFter
//*---------------------------------------------------------------
DWORD CThread::Suspend()
{
if (!m_hHandle) {
return (DWORD)(0xFFFFFFFF);
}
return ::SuspendThread(m_hHandle);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Resume
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴX<EFBFBD> Suspend <EFBFBD><EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> t<EFBFBD><EFBFBD>
// PARM : N/A
// RETV : 1<EFBFBD><EFBFBD><EFBFBD>:previous suspend count / <EFBFBD><EFBFBD>(<EFBFBD>:0xFFFFFFFF
// PRGM : B4nFter
//*---------------------------------------------------------------
DWORD CThread::Resume()
{
if (!m_hHandle) {
return (DWORD)(0xFFFFFFFF);
}
return ::ResumeThread(m_hHandle);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Terminate
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴ|<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD≯h<EFBFBD>
// PARM : 1 . dwExitCode - Thread <EFBFBD><EFBFBD≯T<EFBFBD>ܴ
// RETV : TRUE - 1<EFBFBD><EFBFBD><EFBFBD> / FALSE - <EFBFBD><EFBFBD>(<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CThread::Terminate(DWORD dwExitCode)
{
if (!m_hHandle) {
return FALSE;
}
return ::TerminateThread(m_hHandle, dwExitCode);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::SetPriority
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴ <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . iPriority - <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> (1~31L<EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>8<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>D<EFBFBD> <EFBFBD>]<EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>L<EFBFBD>)
// RETV : TRUE - 1<EFBFBD><EFBFBD><EFBFBD> / FALSE - <EFBFBD><EFBFBD>(<EFBFBD>
// PRGM : B4nFter
// P.S.>
// - MSDN X<EFBFBD> Scheduling Priorities 8<EFBFBD><EFBFBD><EFBFBD>
//*---------------------------------------------------------------
BOOL CThread::SetPriority(INT iPriority)
{
if (!m_hHandle) {
return FALSE;
}
return ::SetThreadPriority(m_hHandle, iPriority);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::SetAffinity
//*---------------------------------------------------------------
// DESC : <EFBFBD><EFBFBD><EFBFBD>ܴ \<EFBFBD>T<EFBFBD>ij|<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . dwMask - \<EFBFBD>T<EFBFBD>ij ȹ<EFBFBD><EFBFBD>l<EFBFBD> (\<EFBFBD>T<EFBFBD>ij|<EFBFBD> $<EFBFBD><EFBFBD>X<EFBFBD><EFBFBD> <EFBFBD> CPU<EFBFBD><EFBFBD><EFBFBD><EFBFBD> t<EFBFBD><EFBFBD><EFBFBD><EFBFBD> D<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>D<EFBFBD> 1\<EFBFBD> K<EFBFBD>)
// RETV : TRUE - 1<EFBFBD><EFBFBD><EFBFBD> / FALSE - <EFBFBD><EFBFBD>(<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CThread::SetAffinity(DWORD dwMask)
{
if (!m_hHandle) {
return FALSE;
}
return (BOOL)::SetThreadAffinityMask(m_hHandle, dwMask);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::GetTlsIndex
//*---------------------------------------------------------------
// DESC : Thread Local Storage |<EFBFBD> `<EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><EFBFBD><EFBFBD> `<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>X<EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> <EFBFBD>8<EFBFBD>4<EFBFBD>
// PARM : N/A
// RETV : `<EFBFBD><EFBFBD><EFBFBD><EFBFBD> TLSX<EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
DWORD CThread::GetTlsIndex()
{
DWORD dwTlsIndex = ::TlsAlloc();
if (dwTlsIndex != TLS_OUT_OF_INDEXES) {
m_setTlsValue.insert(dwTlsIndex);
}
return dwTlsIndex;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::SetTlsValue
//*---------------------------------------------------------------
// DESC : Thread Local Storage X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD>D<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . dwTlsIndex - TLS x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>
// 2 . lpTlsValue - TLS x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>`<EFBFBD> <EFBFBD>
// RETV : TRUE - 1<EFBFBD><EFBFBD><EFBFBD> / FALSE - <EFBFBD><EFBFBD>(<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
BOOL CThread::SetTlsValue(DWORD dwTlsIndex, LPVOID lpTlsValue)
{
std::set<DWORD>::iterator it = m_setTlsValue.find(dwTlsIndex);
if (it != m_setTlsValue.end()) {
return ::TlsSetValue(dwTlsIndex, lpTlsValue);
}
return FALSE;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::FreeTlsIndex
//*---------------------------------------------------------------
// DESC : Thread Local Storage X<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>|<EFBFBD> t<EFBFBD><EFBFBD>
// PARM : 1 . dwTlsIndex - TLS x<EFBFBD>q<EFBFBD><EFBFBD><EFBFBD>
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CThread::FreeTlsIndex(DWORD dwTlsIndex)
{
if (dwTlsIndex == TLS_OUT_OF_INDEXES) {
return;
}
std::set<DWORD>::iterator it = m_setTlsValue.find(dwTlsIndex);
if (it != m_setTlsValue.end()) {
m_setTlsValue.erase(dwTlsIndex);
}
}