VOID STDMETHODCALLTYPE UtilExecutionEngine::TLS_SetValue(DWORD slot, LPVOID pData) { void **pTlsData = CheckThreadState(slot); if (pTlsData) // Yes, CheckThreadState(slot, TRUE) can return NULL now. { pTlsData[slot] = pData; } }
LPVOID STDMETHODCALLTYPE UtilExecutionEngine::TLS_GetValue(DWORD slot) { void **pTlsData = CheckThreadState(slot, FALSE); if (pTlsData) return pTlsData[slot]; else return NULL; }
//线程运行 DWORD CThreadManage::Run() { while (m_ExitFlag) { /*::WaitForSingleObject(m_hTimer,INFINITE);*/ Sleep(6 * 1000); CheckThreadState(); //检测线程状态 } return 0; }
BOOL STDMETHODCALLTYPE UtilExecutionEngine::TLS_CheckValue(DWORD slot, LPVOID * pValue) { void **pTlsData = CheckThreadState(slot, FALSE); if (pTlsData) { *pValue = pTlsData[slot]; return TRUE; } return FALSE; }
VOID STDMETHODCALLTYPE UtilExecutionEngine::TLS_AssociateCallback(DWORD slot, PTLS_CALLBACK_FUNCTION callback) { CheckThreadState(slot); // They can toggle between a callback and no callback. But anything else looks like // confusion on their part. // // (TlsIdx_ClrDebugState associates its callback from utilcode.lib - which can be replicated. But // all the callbacks are equally good.) _ASSERTE(slot == TlsIdx_ClrDebugState || Callbacks[slot] == 0 || Callbacks[slot] == callback || callback == 0); Callbacks[slot] = callback; }
VOID STDMETHODCALLTYPE UtilExecutionEngine::TLS_ThreadDetaching() { void **pTlsData = CheckThreadState(0, FALSE); if (pTlsData) { for (int i=0; i<MAX_PREDEFINED_TLS_SLOT; i++) { // If we have some data and a callback, issue it. if (Callbacks[i] != 0 && pTlsData[i] != 0) (*Callbacks[i])(pTlsData[i]); } ::HeapFree (GetProcessHeap(),0,pTlsData); } }