refactor the g_SyncBlockCacheInstance for aligned (#85241)
authorQiao Pengcheng <qiaopengcheng@loongson.cn>
Tue, 25 Apr 2023 05:45:43 +0000 (13:45 +0800)
committerGitHub <noreply@github.com>
Tue, 25 Apr 2023 05:45:43 +0000 (22:45 -0700)
src/coreclr/vm/syncblk.cpp
src/coreclr/vm/syncblk.h

index 8be38ce..71a32d4 100644 (file)
@@ -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>@todo we can clear this fast too I guess</TODO>
     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;
     }
 
index 32ad8c5..a45d03e 100644 (file)
@@ -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();