diff --git a/src/coreclr/vm/syncblk.cpp b/src/coreclr/vm/syncblk.cpp index 8be38ce3b6e7df..71a32d4fe164e0 100644 --- a/src/coreclr/vm/syncblk.cpp +++ b/src/coreclr/vm/syncblk.cpp @@ -46,15 +46,12 @@ class SyncBlockArray BYTE m_Blocks[MAXSYNCBLOCK * sizeof (SyncBlock)]; }; -// For in-place constructor -BYTE g_SyncBlockCacheInstance[sizeof(SyncBlockCache)]; +SyncBlockCache g_SyncBlockCacheInstance; SPTR_IMPL (SyncBlockCache, SyncBlockCache, s_pSyncBlockCache); #ifndef DACCESS_COMPILE - - #ifndef TARGET_UNIX // static SLIST_HEADER InteropSyncBlockInfo::s_InteropInfoStandbyList; @@ -463,27 +460,7 @@ size_t BitMapSize (size_t cacheSize) // // *************************************************************************** -SyncBlockCache::SyncBlockCache() - : m_pCleanupBlockList(NULL), - m_FreeBlockList(NULL), - - // NOTE: CRST_UNSAFE_ANYMODE prevents a GC mode switch when entering this crst. - // If you remove this flag, we will switch to preemptive mode when entering - // g_criticalSection, which means all functions that enter it will become - // GC_TRIGGERS. (This includes all uses of LockHolder around SyncBlockCache::GetSyncBlockCache(). - // So be sure to update the contracts if you remove this flag. - m_CacheLock(CrstSyncBlockCache, (CrstFlags) (CRST_UNSAFE_ANYMODE | CRST_DEBUGGER_THREAD)), - - m_FreeCount(0), - m_ActiveCount(0), - m_SyncBlocks(0), - m_FreeSyncBlock(0), - m_FreeSyncTableIndex(1), - m_FreeSyncTableList(0), - m_SyncTableSize(SYNC_TABLE_INITIAL_SIZE), - m_OldSyncTables(0), - m_bSyncBlockCleanupInProgress(FALSE), - m_EphemeralBitmap(0) +void SyncBlockCache::Init() { CONTRACTL { @@ -494,11 +471,30 @@ SyncBlockCache::SyncBlockCache() INJECT_FAULT(COMPlusThrowOM()); } CONTRACTL_END; -} + m_pCleanupBlockList = NULL; + m_FreeBlockList = NULL; + + // NOTE: CRST_UNSAFE_ANYMODE prevents a GC mode switch when entering this crst. + // If you remove this flag, we will switch to preemptive mode when entering + // g_criticalSection, which means all functions that enter it will become + // GC_TRIGGERS. (This includes all uses of LockHolder around SyncBlockCache::GetSyncBlockCache(). + // So be sure to update the contracts if you remove this flag. + m_CacheLock.Init(CrstSyncBlockCache, (CrstFlags) (CRST_UNSAFE_ANYMODE | CRST_DEBUGGER_THREAD)); + + m_FreeCount = 0; + m_ActiveCount = 0; + m_SyncBlocks = 0; + m_FreeSyncBlock = 0; + m_FreeSyncTableIndex = 1; + m_FreeSyncTableList = 0; + m_SyncTableSize = SYNC_TABLE_INITIAL_SIZE; + m_OldSyncTables = 0; + m_bSyncBlockCleanupInProgress = FALSE; + m_EphemeralBitmap = 0; +} -// This method is NO longer called. -SyncBlockCache::~SyncBlockCache() +void SyncBlockCache::Destroy() { CONTRACTL { @@ -514,6 +510,8 @@ SyncBlockCache::~SyncBlockCache() //@todo we can clear this fast too I guess m_pCleanupBlockList = NULL; + m_CacheLock.Destroy(); + // destruct all arrays while (m_SyncBlocks) { @@ -655,7 +653,8 @@ void SyncBlockCache::Start() #endif SyncTableEntry::GetSyncTableEntry()[0].m_SyncBlock = 0; - SyncBlockCache::GetSyncBlockCache() = new (&g_SyncBlockCacheInstance) SyncBlockCache; + SyncBlockCache::GetSyncBlockCache() = &g_SyncBlockCacheInstance; + g_SyncBlockCacheInstance.Init(); SyncBlockCache::GetSyncBlockCache()->m_EphemeralBitmap = bm; @@ -681,7 +680,7 @@ void SyncBlockCache::Stop() // sync blocks which are live and thus must have their critical sections destroyed. if (SyncBlockCache::GetSyncBlockCache()) { - delete SyncBlockCache::GetSyncBlockCache(); + SyncBlockCache::GetSyncBlockCache()->Destroy(); SyncBlockCache::GetSyncBlockCache() = 0; } diff --git a/src/coreclr/vm/syncblk.h b/src/coreclr/vm/syncblk.h index 32ad8c522076d0..a45d03e7bf2e6d 100644 --- a/src/coreclr/vm/syncblk.h +++ b/src/coreclr/vm/syncblk.h @@ -1309,7 +1309,7 @@ class SyncBlockCache private: PTR_SLink m_pCleanupBlockList; // list of sync blocks that need cleanup SLink* m_FreeBlockList; // list of free sync blocks - Crst m_CacheLock; // cache lock + CrstStatic m_CacheLock; // cache lock DWORD m_FreeCount; // count of active sync blocks DWORD m_ActiveCount; // number active SyncBlockArray *m_SyncBlocks; // Array of new SyncBlocks. @@ -1345,19 +1345,9 @@ class SyncBlockCache SPTR_DECL(SyncBlockCache, s_pSyncBlockCache); static SyncBlockCache*& GetSyncBlockCache(); - void *operator new(size_t size, void *pInPlace) - { - LIMITED_METHOD_CONTRACT; - return pInPlace; - } - - void operator delete(void *p) - { - LIMITED_METHOD_CONTRACT; - } - - SyncBlockCache(); - ~SyncBlockCache(); + // Note: No constructors/destructors - global instance + void Init(); + void Destroy(); static void Attach(); static void Detach();