void CTLSInitialization::FinalizeTLSAPI() { OU_ASSERT(g_uiThreadLocalStorageInitializationCount != 0U); if (--g_uiThreadLocalStorageInitializationCount == 0U) // Initialization/finalization must be called from main thread { FinalizeTLSAPIValidated(); FinalizeAtomicAPI(); } }
bool CTLSInitialization::InitializeTLSAPI(HTLSKEY &hskOutStorageKey, tlsindextype iValueCount, unsigned int uiInitializationFlags/*=0*/) { OU_ASSERT(g_uiThreadLocalStorageInitializationCount != 0U - 1U); bool bResult = false; bool bAtomicAPIInitialized = false; do { const ESTORAGEINSTANCEKIND ikInstanceKind = (uiInitializationFlags & SIF_MANUAL_CLEANUP_ON_THREAD_EXIT) ? SIK_MANUALCLEANUP : SIK_AUTOCLEANUP; if (g_apsiStorageGlobalInstances[ikInstanceKind] == NULL) // Initialization/finalization must be called from main thread { if (!InitializeAtomicAPI()) { break; } bAtomicAPIInitialized = true; if (!InitializeTLSAPIValidated(ikInstanceKind, iValueCount, uiInitializationFlags)) { break; } const HTLSKEYVALUE &hkvStorageKey = g_apsiStorageGlobalInstances[ikInstanceKind]->RetrieveStorageKey(); g_ahkvStorageGlobalKeyValues[ikInstanceKind] = hkvStorageKey; } ++g_uiThreadLocalStorageInitializationCount; hskOutStorageKey = EncodeKeySelectorFromStorageKind(ikInstanceKind); OU_ASSERT(iValueCount == g_apsiStorageGlobalInstances[ikInstanceKind]->RetrieveValueCount()); OU_ASSERT(uiInitializationFlags == g_apsiStorageGlobalInstances[ikInstanceKind]->RetrieveInitializationFlags()); bResult = true; } while (false); if (!bResult) { if (bAtomicAPIInitialized) { FinalizeAtomicAPI(); } } return bResult; }
bool CTLSInitialization::InitializeTLSAPI(HTLSKEY &hskOutStorageKey, tlsindextype iValueCount, unsigned int uiInitializationFlags/*=0*/) { OU_ASSERT(g_uiThreadLocalStorageInitializationCount != 0U - 1U); bool bResult = false; bool bAtomicAPIInitialized = false; do { if (g_uiThreadLocalStorageInitializationCount == 0U) // Initialization/finalization must be called from main thread { if (!InitializeAtomicAPI()) { break; } bAtomicAPIInitialized = true; if (!InitializeTLSAPIValidated(iValueCount, uiInitializationFlags)) { break; } } ++g_uiThreadLocalStorageInitializationCount; hskOutStorageKey = g_psiStorageGlobalInstance->RetrieveStorageKey(); OU_ASSERT(iValueCount == g_psiStorageGlobalInstance->RetrieveValueCount()); OU_ASSERT(uiInitializationFlags == g_psiStorageGlobalInstance->RetrieveInitializationFlags()); bResult = true; } while (false); if (!bResult) { if (bAtomicAPIInitialized) { FinalizeAtomicAPI(); } } return bResult; }
void CTLSInitialization::FinalizeTLSAPI() { OU_ASSERT(g_uiThreadLocalStorageInitializationCount != 0U); ESTORAGEINSTANCEKIND ikInstanceKind = (--g_uiThreadLocalStorageInitializationCount == 0U) ? SIK__MIN : SIK__MAX; // Initialization/finalization must be called from main thread for (; ikInstanceKind != SIK__MAX; ++ikInstanceKind) { if (g_apsiStorageGlobalInstances[ikInstanceKind]) { g_ahkvStorageGlobalKeyValues[ikInstanceKind] = 0; FinalizeTLSAPIValidated(ikInstanceKind); FinalizeAtomicAPI(); } } }