m_pVolatileBucketTable->m_pBuckets++;
m_pVolatileBucketTable->m_dwNumBuckets = dwNumBuckets;
#ifdef TARGET_64BIT
- m_pVolatileBucketTable->m_dwNumBucketsMul = GetFastModMultiplier(dwNumBuckets);
+ m_pVolatileBucketTable->m_dwNumBucketsMul = dwNumBuckets == 0 ? 0 : GetFastModMultiplier(dwNumBuckets);
#endif
m_Heap = pHeap;
pNewBucketTable->m_pBuckets = pNewBuckets;
pNewBucketTable->m_dwNumBuckets = dwNewNumBuckets;
#ifdef TARGET_64BIT
- pNewBucketTable->m_dwNumBucketsMul = GetFastModMultiplier(dwNewNumBuckets);
+ pNewBucketTable->m_dwNumBucketsMul = dwNewNumBuckets == 0 ? 0 : GetFastModMultiplier(dwNewNumBuckets);
#endif
// Add old table to the to free list. Note that the SyncClean thing will only
inline UINT32 FastMod(UINT32 value, UINT32 divisor, UINT64 multiplier)
{
- return (UINT32)(((((multiplier * value) >> 32) + 1) * divisor) >> 32);
+ _ASSERTE(divisor <= INT_MAX);
+ UINT32 highbits = (UINT32)(((((multiplier * value) >> 32) + 1) * divisor) >> 32);
+ _ASSERTE(highbits == value % divisor);
+ return highbits;
}
#endif