diff --git a/src/coreclr/vm/ceeload.cpp b/src/coreclr/vm/ceeload.cpp index 709ec1e5042984..f6e1cf37e4ebb5 100644 --- a/src/coreclr/vm/ceeload.cpp +++ b/src/coreclr/vm/ceeload.cpp @@ -1550,29 +1550,25 @@ DWORD Module::AllocateDynamicEntry(MethodTable *pMT) } CONTRACTL_END; - DWORD newId = InterlockedExchangeAdd((LONG*)&m_cDynamicEntries, 1); + CrstHolder ch(&m_Crst); + DWORD newId = (LONG)m_cDynamicEntries++; - if (newId >= VolatileLoad(&m_maxDynamicEntries)) + if (newId >= m_maxDynamicEntries) { - CrstHolder ch(&m_Crst); - - if (newId >= m_maxDynamicEntries) + SIZE_T maxDynamicEntries = max(16, m_maxDynamicEntries); + while (maxDynamicEntries <= newId) { - SIZE_T maxDynamicEntries = max(16, m_maxDynamicEntries); - while (maxDynamicEntries <= newId) - { - maxDynamicEntries *= 2; - } + maxDynamicEntries *= 2; + } - DynamicStaticsInfo* pNewDynamicStaticsInfo = (DynamicStaticsInfo*) - (void*)GetLoaderAllocator()->GetHighFrequencyHeap()->AllocMem(S_SIZE_T(sizeof(DynamicStaticsInfo)) * S_SIZE_T(maxDynamicEntries)); + DynamicStaticsInfo* pNewDynamicStaticsInfo = (DynamicStaticsInfo*) + (void*)GetLoaderAllocator()->GetHighFrequencyHeap()->AllocMem(S_SIZE_T(sizeof(DynamicStaticsInfo)) * S_SIZE_T(maxDynamicEntries)); - if (m_pDynamicStaticsInfo) - memcpy(pNewDynamicStaticsInfo, m_pDynamicStaticsInfo, sizeof(DynamicStaticsInfo) * m_maxDynamicEntries); + if (m_pDynamicStaticsInfo) + memcpy(pNewDynamicStaticsInfo, m_pDynamicStaticsInfo, sizeof(DynamicStaticsInfo) * m_maxDynamicEntries); - m_pDynamicStaticsInfo = pNewDynamicStaticsInfo; - VolatileStore(&m_maxDynamicEntries, maxDynamicEntries); - } + VolatileStore(&m_pDynamicStaticsInfo, pNewDynamicStaticsInfo); + m_maxDynamicEntries = maxDynamicEntries; } m_pDynamicStaticsInfo[newId].pEnclosingMT = pMT; diff --git a/src/coreclr/vm/ceeload.inl b/src/coreclr/vm/ceeload.inl index 8cd5189791b8c0..10bc879927a166 100644 --- a/src/coreclr/vm/ceeload.inl +++ b/src/coreclr/vm/ceeload.inl @@ -463,7 +463,7 @@ inline MethodTable* Module::GetDynamicClassMT(DWORD dynamicClassID) { LIMITED_METHOD_CONTRACT; _ASSERTE(m_cDynamicEntries > dynamicClassID); - return m_pDynamicStaticsInfo[dynamicClassID].pEnclosingMT; + return VolatileLoadWithoutBarrier(&m_pDynamicStaticsInfo)[dynamicClassID].pEnclosingMT; } #ifdef FEATURE_CODE_VERSIONING