DragonNest/Server/ServiceMonitorEx/Source/Thread.cpp

444 lines
12 KiB
C++
Raw Normal View History

///////////////////////////////////////////////////////////////////
// INCLUDE
///////////////////////////////////////////////////////////////////
#include "STDAFX.H"
#include "THREAD.H"
///////////////////////////////////////////////////////////////////
// IMPLEMENTATION
///////////////////////////////////////////////////////////////////
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::CThread
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CThread::CThread()
{
Reset();
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::~CThread
//*---------------------------------------------------------------
// DESC : <20>Ҹ<EFBFBD><D2B8><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
CThread::~CThread()
{
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Start
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD>
// PARM : 1 . lpfnThreadProc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ν<EFBFBD><CEBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 2 . lpParam - <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD> (<28><EFBFBD><E2BABB> NULL)
// 3 . lpszName - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> (<28><EFBFBD><E2BABB> NULL)
// 4 . uStackSize - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ũ<EFBFBD><C5A9> (<28><EFBFBD><E2BABB> 0 <20><> 1MB)
// 5 . bSuspend - <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><EFBFBD><E2BABB> FALSE)
// 6 . bAutoEnd - <20><><EFBFBD><EFBFBD> <20><> <20>ڵ<EFBFBD> <20>ڿ<EFBFBD><DABF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (<28><EFBFBD><E2BABB> TRUE, FALSE <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڰ<EFBFBD> <20><><EFBFBD><EFBFBD> CThread::End() ȣ<><C8A3>)
// 7 . m_lpPrepProc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ƾ (<28><EFBFBD><E2BABB> NULL)
// 8 . m_lpPostProc - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD> <20><>ƾ (<28><EFBFBD><E2BABB> NULL)
// 9 . m_lpPrepProcParam - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD>޵Ǵ<DEB5> <20><><EFBFBD><EFBFBD> (<28><EFBFBD><E2BABB> NULL)
// 10 . m_lpPostProcParam - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><>ƾ<EFBFBD><C6BE> <20><><EFBFBD>޵Ǵ<DEB5> <20><><EFBFBD><EFBFBD> (<28><EFBFBD><E2BABB> NULL)
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : N/A
// PRGM : B4nFter
//*---------------------------------------------------------------
VOID CThread::End()
{
if (DF_MEMSTATE_DDDD == (DWORD_PTR)m_hHandle) {
// HEAP <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
return;
}
if (m_hHandle) {
DWORD dwExitCode = 0;
::GetExitCodeThread(m_hHandle, &dwExitCode);
if (STILL_ACTIVE == dwExitCode) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20>ÿ<EFBFBD><C3BF><EFBFBD> TLS<4C><53> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> (STL <20>ڿ<EFBFBD><DABF><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> Access Violation <20><><EFBFBD>ܸ<EFBFBD> <20><><EFBFBD>ϱ<EFBFBD> <20><><EFBFBD><EFBFBD>, <20>ý<EFBFBD><C3BD>ۿ<EFBFBD> <20><><EFBFBD><EFBFBD> <20>ñ<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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>ü<EFBFBD><C3BC> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƾ, CThread:m_lpfnThreadProc <20><> <20><><EFBFBD><EFBFBD>
// PARM : 1 . lpParam - <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڰ<EFBFBD>
// RETV : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<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 : <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . lpszName - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
// RETV : N/A
// PRGM : B4nFter
// P.S.>
// - <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><> (CThread::Start() <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>, CThread::ThreadProc() <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>)
// - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> ǥ<>ô<EFBFBD> Debug <20><> Thread <20><>ȭâ<C8AD><C3A2><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><EFBFBD><EFBFBD>
//*---------------------------------------------------------------
VOID CThread::SetName(LPCTSTR lpszName)
{
SetName(lpszName, (DWORD)(-1));
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::SetName
//*---------------------------------------------------------------
// DESC : Ư<><C6AF> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . lpszName - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
// 2 . pThreadID - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ID
// RETV : N/A
// PRGM : B4nFter
// P.S.>
// - <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>ؾ<EFBFBD> <20><> (CThread::Start() <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>, CThread::ThreadProc() <20><><EFBFBD><EFBFBD> <20≯<EFBFBD> <20><><EFBFBD><EFBFBD>)
// - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD> ǥ<>ô<EFBFBD> Debug <20><> Thread <20><>ȭâ<C8AD><C3A2><EFBFBD><EFBFBD> Ȯ<><C8AE> <20><><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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD><CCB8><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20≯<EFBFBD>
// PRGM : B4nFter
//*---------------------------------------------------------------
LPCTSTR CThread::GetName() const
{
return m_szName;
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Suspend
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Suspend <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : <20><><EFBFBD><EFBFBD>:previous suspend count / <20><><EFBFBD><EFBFBD>:0xFFFFFFFF
// PRGM : B4nFter
//*---------------------------------------------------------------
DWORD CThread::Suspend()
{
if (!m_hHandle) {
return (DWORD)(0xFFFFFFFF);
}
return ::SuspendThread(m_hHandle);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Resume
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Suspend <20><><EFBFBD>¸<EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : <20><><EFBFBD><EFBFBD>:previous suspend count / <20><><EFBFBD><EFBFBD>:0xFFFFFFFF
// PRGM : B4nFter
//*---------------------------------------------------------------
DWORD CThread::Resume()
{
if (!m_hHandle) {
return (DWORD)(0xFFFFFFFF);
}
return ::ResumeThread(m_hHandle);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::Terminate
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : 1 . dwExitCode - Thread <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><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 : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . iPriority - <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD> (1~31<33><31><EFBFBD><EFBFBD>, <20><>ȣ<EFBFBD><C8A3> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><EFBFBD><ECBCB1><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>)
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><EFBFBD><EFBFBD>
// PRGM : B4nFter
// P.S.>
// - MSDN <20><> Scheduling Priorities <20><><EFBFBD><EFBFBD>
//*---------------------------------------------------------------
BOOL CThread::SetPriority(INT iPriority)
{
if (!m_hHandle) {
return FALSE;
}
return ::SetThreadPriority(m_hHandle, iPriority);
}
//*---------------------------------------------------------------
// TYPE : FUNCTION
// NAME : CThread::SetAffinity
//*---------------------------------------------------------------
// DESC : <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ģȭ<C4A3><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . dwMask - ģȭ<C4A3><C8AD> <20><><EFBFBD><EFBFBD>ũ (ģȭ<C4A3><C8AD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD> <20>ϴ<EFBFBD> CPU<50><55><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ش<EFBFBD><D8B4>ϴ<EFBFBD> <20><>Ʈ<EFBFBD><C6AE><EFBFBD><EFBFBD> 1<><31> <20><>)
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><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 <20><> <20>Ҵ<EFBFBD><D2B4>ϰ<EFBFBD> <20>Ҵ<EFBFBD><D2B4><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// PARM : N/A
// RETV : <20>Ҵ<EFBFBD><D2B4><EFBFBD> TLS<4C><53> <20>ε<EFBFBD><CEB5><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 <20><> Ư<><C6AF> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . dwTlsIndex - TLS <20>ε<EFBFBD><CEB5><EFBFBD>
// 2 . lpTlsValue - TLS <20>ε<EFBFBD><CEB5><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>
// RETV : TRUE - <20><><EFBFBD><EFBFBD> / FALSE - <20><><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 <20><> Ư<><C6AF> <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
// PARM : 1 . dwTlsIndex - TLS <20>ε<EFBFBD><CEB5><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);
}
}