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; }