Replace Crst* with CrstStatic for IBCLogger (#20148)
authorMichelle McDaniel <adiaaida@gmail.com>
Thu, 27 Sep 2018 14:28:36 +0000 (07:28 -0700)
committerGitHub <noreply@github.com>
Thu, 27 Sep 2018 14:28:36 +0000 (07:28 -0700)
src/vm/ceeload.cpp
src/vm/ceemain.cpp
src/vm/ibclogger.cpp
src/vm/ibclogger.h

index ffdaea86fe2081ff4c67515329a0900b3f0766f8..5160b7953ba5262b6cc177cfc756496bc64dfd5d 100644 (file)
@@ -3516,7 +3516,7 @@ void Module::StartUnload()
 
         // Acquire the Crst lock before creating the IBCLoggingDisabler object.
         // Only one thread at a time can be processing an IBC logging event.
-        CrstHolder lock(g_IBCLogger.GetSync());
+        CrstHolder lock(IBCLogger::GetSync());
         {
             IBCLoggingDisabler disableLogging( pInfo );  // runs IBCLoggingDisabler::DisableLogging
 
index 885a524340a60f550f0620a499026c2a9b66e294..9874d26f4d476cffaf2b6b9357bc01e02f508bd3 100644 (file)
@@ -1667,7 +1667,7 @@ void STDMETHODCALLTYPE EEShutDownHelper(BOOL fIsDllUnloading)
 
                     // Acquire the Crst lock before creating the IBCLoggingDisabler object.
                     // Only one thread at a time can be processing an IBC logging event.
-                    CrstHolder lock(g_IBCLogger.GetSync());
+                    CrstHolder lock(IBCLogger::GetSync());
                     {
                         IBCLoggingDisabler disableLogging( pInfo );  // runs IBCLoggingDisabler::DisableLogging
                         
index c71921a23f266118b50dd496b01e4833a6c40487..a780754e057ec838d0fc43a700a502e6ca05e971 100644 (file)
@@ -39,6 +39,7 @@
 #endif
 
 DWORD dwIBCLogCount = 0;
+CrstStatic IBCLogger::m_sync;
 
 #ifdef _DEBUG
 /*static*/ unsigned IbcCallback::s_highestId = 0;
@@ -117,18 +118,16 @@ IBCLoggerAwareAllocMemTracker::~IBCLoggerAwareAllocMemTracker()
 
 IBCLogger::IBCLogger()
     : dwInstrEnabled(0)
-    , m_sync(NULL)
-{ LIMITED_METHOD_CONTRACT;}
+{ 
+    LIMITED_METHOD_CONTRACT;
+    m_sync.Init(CrstIbcProfile, CrstFlags(CRST_UNSAFE_ANYMODE | CRST_REENTRANCY | CRST_DEBUGGER_THREAD));
+}
 
 IBCLogger::~IBCLogger()
 {
     WRAPPER_NO_CONTRACT;
 
-    if (m_sync)
-    {
-        delete m_sync;
-        m_sync = NULL;
-    }
+    m_sync.Destroy();
 }
 
 void IBCLogger::LogAccessThreadSafeHelperStatic(const void * p, pfnIBCAccessCallback callback)
@@ -177,7 +176,7 @@ void IBCLogger::LogAccessThreadSafeHelper(const void * p, pfnIBCAccessCallback c
     }
 }
 
-Crst * IBCLogger::GetSync()
+CrstStatic* IBCLogger::GetSync()
 {
     CONTRACTL
     {
@@ -188,18 +187,7 @@ Crst * IBCLogger::GetSync()
     }
     CONTRACTL_END;
 
-    if (!m_sync)
-    {
-        Crst * pNewSync = new Crst(CrstIbcProfile, CrstFlags(CRST_UNSAFE_ANYMODE | CRST_REENTRANCY | CRST_DEBUGGER_THREAD));
-        if (FastInterlockCompareExchangePointer(m_sync.GetPointer(), pNewSync, NULL) != NULL)
-        {
-            // We lost the race
-            delete pNewSync;
-        }
-    }
-    MemoryBarrier();
-
-    return m_sync;
+    return &m_sync;
 }
 
 void IBCLogger::DelayedCallbackPtr(pfnIBCAccessCallback callback, const void * pValue1, const void * pValue2 /*=NULL*/)
@@ -448,7 +436,7 @@ void ThreadLocalIBCInfo::CallbackHelper(const void * p, pfnIBCAccessCallback cal
 
     // Acquire the Crst lock before creating the IBCLoggingDisabler object.
     // Only one thread at a time can be processing an IBC logging event.
-    CrstHolder lock(g_IBCLogger.GetSync());
+    CrstHolder lock(IBCLogger::GetSync());
     {
         // @ToDo: methods called from here should assert that they have the lock that we just took
 
index 9f31151e64d221eefe0b8483dbed2bc34c610913..1fc74ce5b013a2c98c07b6543d53efa8147aa48c 100644 (file)
@@ -599,7 +599,7 @@ public:
         return (dwInstrEnabled != 0);
     }
 
-    Crst * GetSync();
+    static CrstStatic * GetSync();
 
 private:
     void LogMethodAccessHelper(const MethodDesc* pMD, ULONG flagNum);
@@ -614,7 +614,7 @@ private:
 private:
     DWORD dwInstrEnabled;
     
-    Volatile<Crst*> m_sync;
+    static CrstStatic m_sync;
 #endif // DACCESS_COMPILE
 };