From d969f9766f8ae9b895b487cdbd600beeb47ee51b Mon Sep 17 00:00:00 2001 From: Jan Kotas Date: Thu, 23 May 2019 17:38:52 -0700 Subject: [PATCH] Delete FEATURE_TESTHOOK (#24746) --- .../System/Diagnostics/Tracing/EventSource.cs | 7 - src/inc/clrconfigvalues.h | 1 - src/inc/testhook.h | 159 ----- src/vm/CMakeLists.txt | 2 - src/vm/appdomain.cpp | 4 - src/vm/appdomain.hpp | 2 - src/vm/callhelpers.h | 1 - src/vm/ceemain.cpp | 8 - src/vm/debugdebugger.cpp | 1 - src/vm/fcall.h | 2 - src/vm/interpreter.cpp | 3 - src/vm/jithelpers.cpp | 6 - src/vm/peimagelayout.cpp | 7 - src/vm/syncblk.cpp | 1 - src/vm/testhookmgr.cpp | 762 --------------------- src/vm/testhookmgr.h | 101 --- src/vm/threadsuspend.cpp | 2 - 17 files changed, 1069 deletions(-) delete mode 100644 src/inc/testhook.h delete mode 100644 src/vm/testhookmgr.cpp delete mode 100644 src/vm/testhookmgr.h diff --git a/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/EventSource.cs b/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/EventSource.cs index e16a57f..9f59da9 100644 --- a/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/EventSource.cs +++ b/src/System.Private.CoreLib/shared/System/Diagnostics/Tracing/EventSource.cs @@ -3204,13 +3204,6 @@ namespace System.Diagnostics.Tracing if (eventSourceType.IsAbstract() && (flags & EventManifestOptions.Strict) == 0) return null; -#if DEBUG && ES_BUILD_STANDALONE && TEST_SUPPORT - TestSupport.TestHooks.MaybeThrow(eventSourceType, - TestSupport.Category.ManifestError, - "EventSource_CreateManifestAndDescriptors", - new ArgumentException("EventSource_CreateManifestAndDescriptors")); -#endif - try { MethodInfo[] methods = eventSourceType.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); diff --git a/src/inc/clrconfigvalues.h b/src/inc/clrconfigvalues.h index 66fcda6..ab28104 100644 --- a/src/inc/clrconfigvalues.h +++ b/src/inc/clrconfigvalues.h @@ -247,7 +247,6 @@ CONFIG_DWORD_INFO_DIRECT_ACCESS(INTERNAL_SuppressChecks, W("SuppressChecks"), "" #ifdef WIN64EXCEPTIONS CONFIG_DWORD_INFO(INTERNAL_SuppressLockViolationsOnReentryFromOS, W("SuppressLockViolationsOnReentryFromOS"), 0, "64 bit OOM tests re-enter the CLR via RtlVirtualUnwind. This indicates whether to suppress resulting locking violations.") #endif // WIN64EXCEPTIONS -CONFIG_STRING_INFO(INTERNAL_TestHooks, W("TestHooks"), "Used by tests to get test an insight on various CLR workings") /// diff --git a/src/inc/testhook.h b/src/inc/testhook.h deleted file mode 100644 index 90977a1..0000000 --- a/src/inc/testhook.h +++ /dev/null @@ -1,159 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - - -// - -#ifndef CLR_TESTHOOK_H -#define CLR_TESTHOOK_H - -// {CCB32DA2-2544-4195-8552-AC1986A83C73} -static const GUID IID_ICLRTestHook = -{ 0xccb32da2, 0x2544, 0x4195, { 0x85, 0x52, 0xac, 0x19, 0x86, 0xa8, 0x3c, 0x73 } }; -static const GUID IID_ICLRTestHook2 = -{ 0xccb32da2, 0x2544, 0x4195, { 0x85, 0x52, 0xac, 0x19, 0x86, 0xa8, 0x3c, 0x83 } }; -static const GUID IID_ICLRTestHook3 = -{ 0xccb32da2, 0x2544, 0x4195, { 0x85, 0x52, 0xac, 0x19, 0x86, 0xa8, 0x3c, 0x84 } }; -static const GUID IID_ICLRTestHookManager = -{ 0xccb32da2, 0x2544, 0x4195, { 0x85, 0x52, 0xac, 0x19, 0x86, 0xa8, 0x3c, 0x74 } }; - -enum -{ - ADUF_ASYNCHRONOUS, //no wait - ADUF_NORMAL, //wait, might be kicked out - ADUF_FORCEFULLGC, //same as normal, but does full gc -}; - -enum -{ - RTS_INITIALIZED, - RTS_DEFAULTADREADY, - RTS_CALLINGENTRYPOINT -}; - -enum -{ - IM_FLAT=1, - IM_IMAGEMAP=2, - IM_FIXEDUP=4, - IM_LOADLIBRARY=0xc //always fixed up -}; - -class ICLRTestHook : public IUnknown -{ -public: - STDMETHOD(AppDomainStageChanged)(DWORD adid,DWORD oldstage,DWORD newstage)=0; - STDMETHOD(NextFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel)=0; - STDMETHOD(CompletingFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel)=0; - STDMETHOD(CompletedFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel)=0; - STDMETHOD(EnteringAppDomain)(DWORD id)=0; - STDMETHOD(EnteredAppDomain)(DWORD id)=0; - STDMETHOD(LeavingAppDomain)(DWORD id)=0; - STDMETHOD(LeftAppDomain)(DWORD id)=0; - STDMETHOD(UnwindingThreads)(DWORD id) = 0; - STDMETHOD(UnwoundThreads)(DWORD id) = 0; - STDMETHOD(AppDomainCanBeUnloaded)(DWORD id, BOOL bUnsafePoint)=0; - STDMETHOD(AppDomainDestroyed)(DWORD id)=0; - STDMETHOD(RuntimeStarted)(DWORD code)=0; -}; - -class ICLRTestHook2 : public ICLRTestHook -{ -public: - STDMETHOD(ImageMapped(LPCWSTR wszPath, LPCVOID pBaseAddress,DWORD flags))=0; -}; - -class ICLRTestHook3 : public ICLRTestHook2 -{ -public: - STDMETHOD(CompletedNativeImageBind)(LPVOID pFile,LPCUTF8 simpleName, BOOL hasNativeImage)=0; - STDMETHOD(AboutToLockImage)(LPCWSTR wszPath, BOOL bIsCompilationProcess)=0; - STDMETHOD(StartingNativeImageBind)(LPCWSTR wszAsmName, BOOL bIsCompilationProcess)=0; -}; - -class ICLRTestHookManager -{ -public: - STDMETHOD(AddTestHook)(ICLRTestHook* hook)=0; - STDMETHOD(EnableSlowPath) (BOOL bEnable) =0; - STDMETHOD(UnloadAppDomain)(DWORD adid,DWORD flags)=0; - STDMETHOD_(VOID,DoAppropriateWait)( int cObjs, HANDLE *pObjs, INT32 iTimeout, BOOL bWaitAll, int* res)=0; - STDMETHOD(GC)(int generation)=0; - STDMETHOD(GetSimpleName)(LPVOID domainfile,LPCUTF8* name)=0; - STDMETHOD_(INT_PTR,GetCurrentThreadType)(VOID)=0; //see clrhost.h - STDMETHOD_(INT_PTR,GetCurrentThreadLockCount) (VOID) =0; - STDMETHOD_(BOOL,IsPreemptiveGC)(VOID) =0; - STDMETHOD_(BOOL,ThreadCanBeAborted) (VOID) = 0; -}; - -class ICLRTestHookManager2 : public ICLRTestHookManager -{ -public: - STDMETHOD(HasNativeImage)(LPVOID domainfile,BOOL* pHasNativeImage) = 0; -}; - -//sample implementation -class CLRTestHook : public ICLRTestHook3 -{ -private: - LONG m_cRef; -public: - CLRTestHook() - { - m_cRef=0; - } - virtual ~CLRTestHook() {} - STDMETHOD(AppDomainStageChanged)(DWORD adid,DWORD oldstage,DWORD newstage){ return S_OK;}; - STDMETHOD(NextFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel){ return S_OK;}; - STDMETHOD(CompletingFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel){ return S_OK;}; - STDMETHOD(CompletedFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel){ return S_OK;}; - STDMETHOD(EnteringAppDomain)(DWORD id){ return S_OK;}; - STDMETHOD(EnteredAppDomain)(DWORD id){ return S_OK;}; - STDMETHOD(LeavingAppDomain)(DWORD id){ return S_OK;}; - STDMETHOD(LeftAppDomain)(DWORD id){ return S_OK;}; - STDMETHOD(UnwindingThreads)(DWORD id) {return S_OK;}; - STDMETHOD(UnwoundThreads)(DWORD id) {return S_OK;}; - STDMETHOD(AppDomainCanBeUnloaded)(DWORD id, BOOL bUnsafePoint){ return S_OK;}; - STDMETHOD(AppDomainDestroyed)(DWORD id){ return S_OK;}; - STDMETHOD(RuntimeStarted)(DWORD code){ return S_OK;}; - STDMETHOD(ImageMapped(LPCWSTR wszPath, LPCVOID pBaseAddress,DWORD flags)){return S_OK;}; - STDMETHOD(CompletedNativeImageBind)(LPVOID pFile,LPCUTF8 simpleName, BOOL hasNativeImage){return S_OK;}; - STDMETHOD(AboutToLockImage)(LPCWSTR wszPath, BOOL bIsCompilationProcess){return S_OK;}; - STDMETHOD(StartingNativeImageBind)(LPCWSTR wszAsmName, BOOL bIsCompilationProcess){return S_OK;}; - STDMETHOD_(ULONG,AddRef)() - { - return InterlockedIncrement(&m_cRef); - }; - STDMETHOD_(ULONG,Release)() - { - ULONG ulRef = InterlockedDecrement(&m_cRef); - if (!ulRef) - delete this; - return ulRef; - }; - STDMETHOD(QueryInterface)(REFIID riid, void** ppv) - { - if (!ppv) - return E_POINTER; - - if ( IsEqualIID(riid, IID_IUnknown) - || IsEqualIID(riid, IID_ICLRTestHook) - || IsEqualIID(riid, IID_ICLRTestHook2) - || IsEqualIID(riid, IID_ICLRTestHook3)) - { - AddRef(); - *ppv = static_cast(this); - return S_OK; - } - else - { - *ppv = NULL; - return E_NOINTERFACE; - } - }; -}; - -typedef void CALLBACK CLRTESTHOOKPROC(ICLRTestHookManager*); - -#endif diff --git a/src/vm/CMakeLists.txt b/src/vm/CMakeLists.txt index 7acfa94..61ee680 100644 --- a/src/vm/CMakeLists.txt +++ b/src/vm/CMakeLists.txt @@ -385,7 +385,6 @@ set(VM_SOURCES_WKS syncclean.cpp synch.cpp synchronizationcontextnative.cpp - testhookmgr.cpp threaddebugblockinginfo.cpp threadsuspend.cpp typeparse.cpp @@ -504,7 +503,6 @@ set(VM_HEADERS_WKS syncclean.hpp synch.h synchronizationcontextnative.h - testhookmgr.h tieredcompilation.h threaddebugblockinginfo.h threadsuspend.h diff --git a/src/vm/appdomain.cpp b/src/vm/appdomain.cpp index 4e98706..aab397e 100644 --- a/src/vm/appdomain.cpp +++ b/src/vm/appdomain.cpp @@ -4104,7 +4104,6 @@ DomainFile *AppDomain::LoadDomainFile(FileLoadLock *pLock, FileLoadLevel targetL TryIncrementalLoad(pFile, workLevel, fileLock); } - TESTHOOKCALL(CompletedFileLoadLevel(DefaultADID,pFile,workLevel)); } if (pLock->GetLoadLevel() == immediateTargetLevel-1) @@ -4169,9 +4168,7 @@ void AppDomain::TryIncrementalLoad(DomainFile *pFile, FileLoadLevel workLevel, F } // Do the work - TESTHOOKCALL(NextFileLoadLevel(DefaultADID,pFile,workLevel)); BOOL success = pFile->DoIncrementalLoad(workLevel); - TESTHOOKCALL(CompletingFileLoadLevel(DefaultADID,pFile,workLevel)); if (released) { // Reobtain lock to increment level. (Note that another thread may @@ -5416,7 +5413,6 @@ ULONG AppDomain::Release() { _ASSERTE (m_Stage == STAGE_CREATING); delete this; - TESTHOOKCALL(AppDomainDestroyed(DefaultADID)); } return (cRef); } diff --git a/src/vm/appdomain.hpp b/src/vm/appdomain.hpp index 3d4a732..2d14256 100644 --- a/src/vm/appdomain.hpp +++ b/src/vm/appdomain.hpp @@ -25,7 +25,6 @@ #include "domainfile.h" #include "objectlist.h" #include "fptrstubs.h" -#include "testhookmgr.h" #include "gcheaputilities.h" #include "gchandleutilities.h" #include "../binder/inc/applicationcontext.hpp" @@ -2570,7 +2569,6 @@ private: } CONTRACTL_END; STRESS_LOG1(LF_APPDOMAIN, LL_INFO100,"Updating AD stage, stage=%d\n",stage); - TESTHOOKCALL(AppDomainStageChanged(DefaultADID,m_Stage,stage)); Stage lastStage=m_Stage; while (lastStage !=stage) lastStage = (Stage)FastInterlockCompareExchange((LONG*)&m_Stage,stage,lastStage); diff --git a/src/vm/callhelpers.h b/src/vm/callhelpers.h index f0d718c..c30dc0b 100644 --- a/src/vm/callhelpers.h +++ b/src/vm/callhelpers.h @@ -542,7 +542,6 @@ enum EEToManagedCallFlags /* thread abort has been requested */ \ if (!(flags & EEToManagedCriticalCall)) \ { \ - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE)); \ if (CURRENT_THREAD->IsAbortRequested()) { \ CURRENT_THREAD->HandleThreadAbort(); \ } \ diff --git a/src/vm/ceemain.cpp b/src/vm/ceemain.cpp index e03c78b..3b02b31 100644 --- a/src/vm/ceemain.cpp +++ b/src/vm/ceemain.cpp @@ -355,10 +355,6 @@ HRESULT EnsureEEStarted(COINITIEE flags) } } -#ifdef FEATURE_TESTHOOKS - if(bStarted) - TESTHOOKCALL(RuntimeStarted(RTS_INITIALIZED)); -#endif END_ENTRYPOINT_NOTHROW; } else @@ -682,10 +678,6 @@ void EEStartupHelper(COINITIEE fFlags) Frame::Init(); -#ifdef FEATURE_TESTHOOKS - IfFailGo(CLRTestHookManager::CheckConfig()); -#endif - #endif // CROSSGEN_COMPILE diff --git a/src/vm/debugdebugger.cpp b/src/vm/debugdebugger.cpp index 93457b4..58c186a 100644 --- a/src/vm/debugdebugger.cpp +++ b/src/vm/debugdebugger.cpp @@ -826,7 +826,6 @@ FCIMPL1(void, DebugDebugger::CustomNotification, Object * dataUNSAFE) g_pDebugInterface->SendCustomDebuggerNotification(pThread, pDomainFile, classToken); pThread->ClearThreadCurrNotification(); - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID, FALSE)); if (pThread->IsAbortRequested()) { pThread->HandleThreadAbort(); diff --git a/src/vm/fcall.h b/src/vm/fcall.h index 55d5826..7569c85 100644 --- a/src/vm/fcall.h +++ b/src/vm/fcall.h @@ -573,7 +573,6 @@ LPVOID __FCThrowArgument(LPVOID me, enum RuntimeExceptionKind reKind, LPCWSTR ar #define HELPER_METHOD_FRAME_BEGIN_EX(ret, helperFrame, gcpoll, allowGC) \ HELPER_METHOD_FRAME_BEGIN_EX_BODY(ret, helperFrame, gcpoll, allowGC) \ - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,!allowGC)); \ /* TODO TURN THIS ON!!! */ \ /* gcpoll; */ \ INSTALL_MANAGED_EXCEPTION_DISPATCHER; \ @@ -609,7 +608,6 @@ LPVOID __FCThrowArgument(LPVOID me, enum RuntimeExceptionKind reKind, LPCWSTR ar #define HELPER_METHOD_FRAME_END_EX(gcpoll,allowGC) \ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER; \ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER; \ - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,!allowGC)); \ HELPER_METHOD_FRAME_END_EX_BODY(gcpoll,allowGC); #define HELPER_METHOD_FRAME_END_EX_NOTHROW(gcpoll,allowGC) \ diff --git a/src/vm/interpreter.cpp b/src/vm/interpreter.cpp index dbde2d1..df68465 100644 --- a/src/vm/interpreter.cpp +++ b/src/vm/interpreter.cpp @@ -1774,8 +1774,6 @@ static void MonitorExit(Object* obj, BYTE* pbLockTaken) COMPlusThrow(kSynchronizationLockException); if (pbLockTaken != 0) *pbLockTaken = 0; - - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID, FALSE)); if (GET_THREAD()->IsAbortRequested()) { GET_THREAD()->HandleThreadAbort(); @@ -1794,7 +1792,6 @@ static void MonitorExitStatic(AwareLock *lock, BYTE* pbLockTaken) if (!lock->Leave()) COMPlusThrow(kSynchronizationLockException); - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID, FALSE)); if (GET_THREAD()->IsAbortRequested()) { GET_THREAD()->HandleThreadAbort(); } diff --git a/src/vm/jithelpers.cpp b/src/vm/jithelpers.cpp index 261b9ac..47e82f4 100644 --- a/src/vm/jithelpers.cpp +++ b/src/vm/jithelpers.cpp @@ -4455,8 +4455,6 @@ NOINLINE static void JIT_MonExit_Helper(Object* obj, BYTE* pbLockTaken) COMPlusThrow(kSynchronizationLockException); if (pbLockTaken != 0) *pbLockTaken = 0; - - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE)); if (GET_THREAD()->IsAbortRequested()) { GET_THREAD()->HandleThreadAbort(); @@ -4480,8 +4478,6 @@ NOINLINE static void JIT_MonExit_Signal(Object* obj) SyncBlock *psb = objRef->PassiveGetSyncBlock(); if (psb != NULL) psb->QuickGetMonitor()->Signal(); - - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE)); if (GET_THREAD()->IsAbortRequested()) { GET_THREAD()->HandleThreadAbort(); @@ -4619,7 +4615,6 @@ NOINLINE static void JIT_MonExitStatic_Helper(AwareLock *lock, BYTE* pbLockTaken COMPlusThrow(kSynchronizationLockException); MONHELPER_STATE(*pbLockTaken = 0;) - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE)); if (GET_THREAD()->IsAbortRequested()) { GET_THREAD()->HandleThreadAbort(); } @@ -4637,7 +4632,6 @@ NOINLINE static void JIT_MonExitStatic_Signal(AwareLock *lock) lock->Signal(); - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE)); if (GET_THREAD()->IsAbortRequested()) { GET_THREAD()->HandleThreadAbort(); } diff --git a/src/vm/peimagelayout.cpp b/src/vm/peimagelayout.cpp index c965c61..b689236 100644 --- a/src/vm/peimagelayout.cpp +++ b/src/vm/peimagelayout.cpp @@ -335,7 +335,6 @@ RawImageLayout::RawImageLayout(const void *flat, COUNT_T size, PEImage* pOwner) memcpy(m_DataCopy,flat,size); flat=m_DataCopy; } - TESTHOOKCALL(ImageMapped(GetPath(),flat,IM_FLAT)); Init((void*)flat,size); } RawImageLayout::RawImageLayout(const void *mapped, PEImage* pOwner, BOOL bTakeOwnership, BOOL bFixedUp) @@ -364,7 +363,6 @@ RawImageLayout::RawImageLayout(const void *mapped, PEImage* pOwner, BOOL bTakeOw #endif // !FEATURE_PAL } - TESTHOOKCALL(ImageMapped(GetPath(),mapped,bFixedUp?IM_IMAGEMAP|IM_FIXEDUP:IM_IMAGEMAP)); IfFailThrow(Init((void*)mapped,(bool)(bFixedUp!=FALSE))); } @@ -401,7 +399,6 @@ ConvertedImageLayout::ConvertedImageLayout(PEImageLayout* source) ThrowLastError(); source->LayoutILOnly(m_FileView, TRUE); //@TODO should be false for streams - TESTHOOKCALL(ImageMapped(GetPath(),m_FileView,IM_IMAGEMAP)); IfFailThrow(Init(m_FileView)); #ifdef CROSSGEN_COMPILE @@ -468,7 +465,6 @@ MappedImageLayout::MappedImageLayout(HANDLE hFile, PEImage* pOwner) m_FileView.Assign(CLRMapViewOfFile(m_FileMap, 0, 0, 0, 0)); if (m_FileView == NULL) ThrowLastError(); - TESTHOOKCALL(ImageMapped(GetPath(),m_FileView,IM_IMAGEMAP)); IfFailThrow(Init((void *) m_FileView)); #ifdef CROSSGEN_COMPILE @@ -536,7 +532,6 @@ MappedImageLayout::MappedImageLayout(HANDLE hFile, PEImage* pOwner) LOG((LF_LOADER, LL_INFO1000, "PEImage: image %S (hFile %p) mapped @ %p\n", (LPCWSTR) GetPath(), hFile, (void*)m_LoadedFile)); - TESTHOOKCALL(ImageMapped(GetPath(),m_LoadedFile,IM_IMAGEMAP)); IfFailThrow(Init((void *) m_LoadedFile)); if (!HasCorHeader()) @@ -587,7 +582,6 @@ LoadedImageLayout::LoadedImageLayout(PEImage* pOwner, BOOL bNTSafeLoad, BOOL bTh HRESULT hr = HRESULT_FROM_GetLastError(); EEFileLoadException::Throw(pOwner->GetPath(), hr, NULL); } - TESTHOOKCALL(ImageMapped(GetPath(),m_Module,IM_LOADLIBRARY)); IfFailThrow(Init(m_Module,true)); LOG((LF_LOADER, LL_INFO1000, "PEImage: Opened HMODULE %S\n", (LPCWSTR) GetPath())); @@ -624,7 +618,6 @@ FlatImageLayout::FlatImageLayout(HANDLE hFile, PEImage* pOwner) if (m_FileView == NULL) ThrowLastError(); } - TESTHOOKCALL(ImageMapped(GetPath(),m_FileView,IM_FLAT)); Init(m_FileView, size); } diff --git a/src/vm/syncblk.cpp b/src/vm/syncblk.cpp index c344b1b..5baab75 100644 --- a/src/vm/syncblk.cpp +++ b/src/vm/syncblk.cpp @@ -2458,7 +2458,6 @@ BOOL AwareLock::TryEnter(INT32 timeOut) CONTRACTL_END; Thread *pCurThread = GetThread(); - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID, FALSE)); if (pCurThread->IsAbortRequested()) { diff --git a/src/vm/testhookmgr.cpp b/src/vm/testhookmgr.cpp deleted file mode 100644 index f72f69d..0000000 --- a/src/vm/testhookmgr.cpp +++ /dev/null @@ -1,762 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - - -// - -#include "common.h" -#include "testhookmgr.h" -#include "appdomain.hpp" -#include "appdomain.inl" -#include "finalizerthread.h" - -#ifdef FEATURE_TESTHOOKS -CLRTestHookManager* CLRTestHookManager::g_pManager=NULL; -CLRTestHookManager::~CLRTestHookManager() -{ - -} - -HRESULT CLRTestHookManager::AddTestHook(ICLRTestHook* hook) -{ - WRAPPER_NO_CONTRACT; - DWORD newidx=FastInterlockIncrement(&m_nHooks); - if (newidx>=NumItems(m_pHooks)) - { - FastInterlockDecrement(&m_nHooks); - return DISP_E_OVERFLOW; - } - m_pHooks[newidx-1].Set(hook); - return S_OK; -} - - -ICLRTestHookManager* CLRTestHookManager::Start() -{ - LIMITED_METHOD_CONTRACT; - if (g_pManager==NULL) - { - CLRTestHookManager* newman=new (nothrow)CLRTestHookManager(); - if (newman!=NULL && FastInterlockCompareExchangePointer(&g_pManager, newman, 0)!=0) - delete newman; - } - if(g_pManager) - g_pManager->AddRef(); - return g_pManager; -} - -CLRTestHookManager::CLRTestHookManager() -{ - WRAPPER_NO_CONTRACT; - m_nHooks=0; - m_cRef=1; - ZeroMemory(m_pHooks,sizeof(m_pHooks)); -} - -HRESULT CLRTestHookManager::AppDomainStageChanged(DWORD adid,DWORD oldstage,DWORD newstage) -{ - STATIC_CONTRACT_NOTHROW; - - struct Param - { - CLRTestHookManager *pThis; - DWORD adid; - DWORD oldstage; - DWORD newstage; - } param; - param.pThis = this; - param.adid = adid; - param.oldstage = oldstage; - param.newstage = newstage; - - PAL_TRY(Param *, pParam, ¶m) - { - //ignores the returned codes - for (LONG i = 0; i < pParam->pThis->m_nHooks; i++) - { - ICLRTestHook* hook = pParam->pThis->m_pHooks[i].v1(); - if(hook) - { - HRESULT hr=hook->AppDomainStageChanged(pParam->adid, pParam->oldstage, pParam->newstage); - _ASSERTE(SUCCEEDED(hr)); - } - } - } - PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - _ASSERTE(!"Test Hook threw an exception."); - } - PAL_ENDTRY; - - return S_OK; -}; - - -HRESULT CLRTestHookManager::NextFileLoadLevel(DWORD adid, LPVOID domainfile,DWORD newlevel) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - for (LONG i=0;iNextFileLoadLevel( adid, domainfile, newlevel); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::CompletingFileLoadLevel(DWORD adid, LPVOID domainfile,DWORD newlevel) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - for (LONG i=0;iCompletingFileLoadLevel( adid, domainfile, newlevel); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - - - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::CompletedFileLoadLevel(DWORD adid, LPVOID domainfile,DWORD newlevel) -{ - STATIC_CONTRACT_NOTHROW; - - struct Param - { - CLRTestHookManager *pThis; - DWORD adid; - LPVOID domainfile; - DWORD newlevel; - } param; - param.pThis = this; - param.adid = adid; - param.domainfile = domainfile; - param.newlevel = newlevel; - - PAL_TRY(Param *, pParam, ¶m) - { - //ignores the returned codes - for (LONG i = 0; i < pParam->pThis->m_nHooks; i++) - { - ICLRTestHook* hook = pParam->pThis->m_pHooks[i].v1(); - if(hook) - { - HRESULT hr=hook->CompletedFileLoadLevel(pParam->adid, pParam->domainfile, pParam->newlevel); - _ASSERTE(SUCCEEDED(hr)); - } - } - } - PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - _ASSERTE(!"Test Hook threw an exception."); - } - PAL_ENDTRY - - return S_OK; -} - -HRESULT CLRTestHookManager::EnteringAppDomain(DWORD adid) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - for (LONG i=0;iEnteringAppDomain(adid); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::EnteredAppDomain(DWORD adid) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - for (LONG i=0;iEnteredAppDomain(adid); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::LeavingAppDomain(DWORD adid) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - for (LONG i=0;iLeavingAppDomain(adid); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::LeftAppDomain(DWORD adid) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - for (LONG i=0;iLeftAppDomain(adid); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::UnwindingThreads(DWORD adid) -{ - STATIC_CONTRACT_NOTHROW; - - struct Param - { - CLRTestHookManager *pThis; - DWORD adid; - } param; - param.pThis = this; - param.adid = adid; - - PAL_TRY(Param *, pParam, ¶m) - { - //ignores the returned codes - for (LONG i = 0; i < pParam->pThis->m_nHooks; i++) - { - ICLRTestHook* hook = pParam->pThis->m_pHooks[i].v1(); - if(hook) - { - HRESULT hr=hook->UnwindingThreads(pParam->adid); - _ASSERTE(SUCCEEDED(hr)); - } - } - } - PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - _ASSERTE(!"Test Hook threw an exception."); - } - PAL_ENDTRY - - return S_OK; -} - -HRESULT CLRTestHookManager::RuntimeStarted(DWORD code) -{ - STATIC_CONTRACT_NOTHROW; - - struct Param - { - CLRTestHookManager *pThis; - DWORD code; - } param; - param.pThis = this; - param.code = code; - - PAL_TRY(Param *, pParam, ¶m) - { - //ignores the returned codes - for (LONG i = 0; i < pParam->pThis->m_nHooks; i++) - { - ICLRTestHook* hook = pParam->pThis->m_pHooks[i].v1(); - if(hook) - { - HRESULT hr=hook->RuntimeStarted(pParam->code); - _ASSERTE(SUCCEEDED(hr)); - } - } - } - PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - _ASSERTE(!"Test Hook threw an exception."); - } - PAL_ENDTRY - - return S_OK; -} - -HRESULT CLRTestHookManager::UnwoundThreads(DWORD adid) -{ - STATIC_CONTRACT_NOTHROW; - - struct Param - { - CLRTestHookManager *pThis; - DWORD adid; - } param; - param.pThis = this; - param.adid = adid; - - PAL_TRY(Param *, pParam, ¶m) - { - //ignores the returned codes - for (LONG i = 0; i < pParam->pThis->m_nHooks; i++) - { - ICLRTestHook* hook = pParam->pThis->m_pHooks[i].v1(); - if(hook) - { - HRESULT hr=hook->UnwoundThreads(pParam->adid); - _ASSERTE(SUCCEEDED(hr)); - } - } - } - PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - _ASSERTE(!"Test Hook threw an exception."); - } - PAL_ENDTRY - - return S_OK; -} - -HRESULT CLRTestHookManager::AppDomainDestroyed(DWORD adid) -{ - STATIC_CONTRACT_NOTHROW; - - struct Param - { - CLRTestHookManager *pThis; - DWORD adid; - } param; - param.pThis = this; - param.adid = adid; - - PAL_TRY(Param *, pParam, ¶m) - { - //ignores the returned codes - for (LONG i = 0; i < pParam->pThis->m_nHooks; i++) - { - ICLRTestHook* hook = pParam->pThis->m_pHooks[i].v1(); - if(hook) - { - HRESULT hr=hook->AppDomainDestroyed(pParam->adid); - _ASSERTE(SUCCEEDED(hr)); - } - } - } - PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - _ASSERTE(!"Test Hook threw an exception."); - } - PAL_ENDTRY - - return S_OK; -} - -STDMETHODIMP CLRTestHookManager::ImageMapped(LPCWSTR wszPath, LPCVOID pBaseAddress,DWORD flags) -{ - STATIC_CONTRACT_NOTHROW; - - struct Param - { - CLRTestHookManager *pThis; - LPCWSTR wszPath; - LPCVOID pBaseAddress; - DWORD flags; - } param; - param.pThis = this; - param.wszPath = wszPath; - param.pBaseAddress = pBaseAddress; - param.flags = flags; - - PAL_TRY(Param *, pParam, ¶m) - { - //ignores the returned codes - for (LONG i = 0; i < pParam->pThis->m_nHooks; i++) - { - ICLRTestHook2* hook = pParam->pThis->m_pHooks[i].v2(); - if(hook) - { - HRESULT hr=hook->ImageMapped(pParam->wszPath,pParam->pBaseAddress,pParam->flags); - _ASSERTE(SUCCEEDED(hr)); - } - } - } - PAL_EXCEPT(EXCEPTION_EXECUTE_HANDLER) - { - _ASSERTE(!"Test Hook threw an exception."); - } - PAL_ENDTRY - - return S_OK; - -} - -HRESULT CLRTestHookManager::AppDomainCanBeUnloaded(DWORD adid, BOOL bUnsafePoint) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - if (!ThreadCanBeAborted()) - return S_OK; - for (LONG i=0;iAppDomainCanBeUnloaded(adid,bUnsafePoint); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::StartingNativeImageBind(LPCWSTR wszAsmName, BOOL bIsCompilationProcess) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - for (LONG i=0;iStartingNativeImageBind(wszAsmName, bIsCompilationProcess); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::CompletedNativeImageBind(LPVOID pFile,LPCUTF8 simpleName, BOOL hasNativeImage) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - for (LONG i=0;iCompletedNativeImageBind(pFile, simpleName, hasNativeImage); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::AboutToLockImage(LPCWSTR wszPath, BOOL bIsCompilationProcess) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - { - for (LONG i=0;iAboutToLockImage(wszPath, bIsCompilationProcess); - _ASSERTE(SUCCEEDED(hr)||SUCCEEDED(hr2)); - if (SUCCEEDED(hr)) - hr=hr2; - } - } - } - - IfFailThrow(hr); - return hr; -} - -HRESULT CLRTestHookManager::EnableSlowPath (BOOL bEnable) -{ - WRAPPER_NO_CONTRACT; - ThreadStore::TrapReturningThreads(bEnable); - return S_OK; -} - -ULONG CLRTestHookManager::AddRef() -{ - return FastInterlockIncrement(&m_cRef); -} - -ULONG CLRTestHookManager::Release() -{ - ULONG nRet= FastInterlockDecrement(&m_cRef); - // never goes away - return nRet; -} - -HRESULT CLRTestHookManager::QueryInterface(REFIID riid, void **ppv) -{ - if (riid!=IID_IUnknown && riid!=IID_ICLRTestHookManager) - return E_NOINTERFACE; - AddRef(); - *ppv=(ICLRTestHookManager*)this; - return S_OK; -} - - -HRESULT CLRTestHookManager::CheckConfig() -{ - CONTRACTL - { - THROWS; - GC_NOTRIGGER; - MODE_ANY; - } - CONTRACTL_END; - - HRESULT hr=S_OK; - if (g_pConfig) - { - LPWSTR szTestHooks=NULL; - hr=CLRConfig::GetConfigValue(CLRConfig::INTERNAL_TestHooks,&szTestHooks); - if (SUCCEEDED(hr) && szTestHooks!=NULL && *szTestHooks!=W('\0')) - { - LPWSTR curr=szTestHooks; - do - { - LPWSTR next=wcschr(curr,W(';')); - if (next) - *(next++)=0; - LPWSTR delim=wcschr(curr,W(',')); - if (delim) - { - *(delim++)=W('\0'); - HMODULE hMod=WszLoadLibrary(curr); - _ASSERTE(hMod); - if (hMod!=NULL) - { - MAKE_MULTIBYTE_FROMWIDE(szFName,delim,CP_ACP); - CLRTESTHOOKPROC* fn=(CLRTESTHOOKPROC*)GetProcAddress(hMod,szFName); - _ASSERTE(fn); - if(fn) - fn(Start()); - } - } - curr=next; - } - while(curr!=NULL && *curr!=W('\0')); - - delete szTestHooks; - } - } - return hr; -} - - -HRESULT CLRTestHookManager::UnloadAppDomain(DWORD adid,DWORD flags) -{ - return COR_E_CANNOTUNLOADAPPDOMAIN; -} - -VOID CLRTestHookManager::DoAppropriateWait( int cObjs, HANDLE *pObjs, INT32 iTimeout, BOOL bWaitAll, int* res) -{ - CONTRACTL - { - THROWS; - GC_TRIGGERS; - MODE_ANY; - } - CONTRACTL_END; - - - Thread* thread=GetThread(); - DWORD result = WAIT_FAILED; - if(thread) - result=thread->DoAppropriateWait(cObjs,pObjs,bWaitAll,iTimeout,WaitMode_Alertable,NULL); - else - { - result = WaitForMultipleObjectsEx(cObjs,pObjs,bWaitAll,iTimeout,TRUE); - } -} - - -HRESULT CLRTestHookManager::GC(int generation) -{ - CONTRACTL - { - THROWS; - GC_TRIGGERS; - MODE_ANY; - } - CONTRACTL_END; - - _ASSERTE(GetThread()==NULL || !GetThread()->PreemptiveGCDisabled()); - GCHeapUtilities::GetGCHeap()->GarbageCollect(generation); - FinalizerThread::FinalizerThreadWait(); - return S_OK; -} - - -HRESULT CLRTestHookManager::GetSimpleName(LPVOID domainfile,LPCUTF8* name) -{ - HRESULT hr=S_OK; - EX_TRY - { - *name=((DomainFile*)domainfile)->GetSimpleName(); - } - EX_CATCH_HRESULT(hr); - return hr; -} - - - -INT_PTR CLRTestHookManager::GetCurrentThreadType() -{ - WRAPPER_NO_CONTRACT; - return (INT_PTR) ClrFlsGetValue (TlsIdx_ThreadType); -} - -INT_PTR CLRTestHookManager::GetCurrentThreadLockCount (VOID) -{ - LIMITED_METHOD_CONTRACT; - Thread* thread=GetThread(); - if(!thread) - return 0; - return thread->m_dwLockCount; - -}; - - -BOOL CLRTestHookManager::IsPreemptiveGC (VOID) -{ - LIMITED_METHOD_CONTRACT; - Thread *thread = GetThread(); - // Preemptive GC is default - if (thread == NULL) - return TRUE; - else - return !thread->PreemptiveGCDisabled(); -}; - - -BOOL CLRTestHookManager::ThreadCanBeAborted (VOID) -{ - LIMITED_METHOD_CONTRACT; - return (GetThread()==NULL || GetThread()->IsAbortPrevented() || GetThread()->IsAsyncPrevented())?FALSE:TRUE; -} - -HRESULT CLRTestHookManager::HasNativeImage(LPVOID domainfile,BOOL* pHasNativeImage) -{ - STATIC_CONTRACT_THROWS; - HRESULT hr=S_OK; - EX_TRY - { - if (domainfile && ((DomainFile*)domainfile)->GetFile()) - { - *pHasNativeImage=((DomainFile*)domainfile)->GetFile()->HasNativeImage(); - } - else - *pHasNativeImage = 0; - } - EX_CATCH_HRESULT(hr); - return hr; -} - - -void CLRTestHookInfo::Set(ICLRTestHook* hook) -{ - LIMITED_METHOD_CONTRACT; - if (SUCCEEDED(hook->QueryInterface(IID_ICLRTestHook3,(void**)&m_Hook.v3))) - { - m_Version=3; - return; - } - else if (SUCCEEDED(hook->QueryInterface(IID_ICLRTestHook2,(void**)&m_Hook.v2))) - { - m_Version=2; - return; - } - else - { - m_Version=1; - } - hook->AddRef(); - m_Hook.v1=hook; -} - -ICLRTestHook* CLRTestHookInfo::v1() -{ - return m_Hook.v1; -} - -ICLRTestHook2* CLRTestHookInfo::v2() -{ - LIMITED_METHOD_CONTRACT; - if(m_Version==2) - return m_Hook.v2; - return NULL; -} - -ICLRTestHook3* CLRTestHookInfo::v3() -{ - if(m_Version>=3) - return m_Hook.v3; - return NULL; -} - - - -//to make sure CLRTestHook is ok -static CLRTestHook _hook; - -#endif - - diff --git a/src/vm/testhookmgr.h b/src/vm/testhookmgr.h deleted file mode 100644 index fc21501..0000000 --- a/src/vm/testhookmgr.h +++ /dev/null @@ -1,101 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - - -// - -#ifndef CLR_TESTHOOKMGR_H -#define CLR_TESTHOOKMGR_H - -#include "testhook.h" - -#if defined(_DEBUG) && !defined(CROSSGEN_COMPILE) -#define FEATURE_TESTHOOKS -#endif - -#ifdef FEATURE_TESTHOOKS -#define TESTHOOKCALL(function) \ - do { if(CLRTestHookManager::Enabled()) \ - CLRTestHookManager::TestHook()->function;} while(0) - -#define TESTHOOKENABLED CLRTestHookManager::Enabled() -#define TESTHOOKSLOWPATH CLRTestHookManager::SlowPathEnabled() - -#define MAX_TEST_HOOKS 32 - -//Forward declarations -template class Volatile; -extern "C" Volatile g_TrapReturningThreads; - - -struct CLRTestHookInfo -{ -protected: - int m_Version; - union - { - ICLRTestHook* v1; - ICLRTestHook2* v2; - ICLRTestHook3* v3; - } m_Hook; -public: - void Set(ICLRTestHook*); - ICLRTestHook* v1(); - ICLRTestHook2* v2(); - ICLRTestHook3* v3(); -}; - -class CLRTestHookManager: public ICLRTestHookManager2, public ICLRTestHook3 -{ -protected: - static CLRTestHookManager* g_pManager; - Volatile m_nHooks; - Volatile m_cRef; - CLRTestHookInfo m_pHooks[MAX_TEST_HOOKS]; - virtual ~CLRTestHookManager(); -public: - CLRTestHookManager(); - STDMETHOD(AddTestHook)(ICLRTestHook* hook); - static ICLRTestHookManager* Start(); - static BOOL Enabled() {return g_pManager!=NULL;}; - static BOOL SlowPathEnabled() {return Enabled() && g_TrapReturningThreads;}; - static CLRTestHookManager* TestHook() {return g_pManager;}; - static HRESULT CheckConfig(); - STDMETHOD_(ULONG,AddRef) (); - STDMETHOD_(ULONG, Release()); - STDMETHOD (QueryInterface)(REFIID riid, void * *ppvObject); - STDMETHOD(AppDomainStageChanged)(DWORD adid,DWORD oldstage,DWORD newstage); - STDMETHOD(NextFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel); - STDMETHOD(CompletingFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel); - STDMETHOD(CompletedFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel); - STDMETHOD(EnteringAppDomain)(DWORD adid); - STDMETHOD(EnteredAppDomain)(DWORD adid); - STDMETHOD(LeavingAppDomain)(DWORD adid); - STDMETHOD(LeftAppDomain)(DWORD adid); - STDMETHOD(UnwindingThreads)(DWORD adid); - STDMETHOD(UnwoundThreads)(DWORD adid); - STDMETHOD(AppDomainCanBeUnloaded)(DWORD adid, BOOL bUnsafePoint); - STDMETHOD(AppDomainDestroyed)(DWORD adid); - STDMETHOD(EnableSlowPath) (BOOL bEnable); - STDMETHOD(UnloadAppDomain)(DWORD adid,DWORD flags); - STDMETHOD(StartingNativeImageBind)(LPCWSTR wszAsmName, BOOL bIsCompilationProcess); - STDMETHOD(CompletedNativeImageBind)(LPVOID pFile,LPCUTF8 simpleName, BOOL hasNativeImage); - STDMETHOD(AboutToLockImage)(LPCWSTR wszPath, BOOL bIsCompilationProcess); - STDMETHOD_(VOID,DoAppropriateWait)( int cObjs, HANDLE *pObjs, INT32 iTimeout, BOOL bWaitAll, int* res); - STDMETHOD(GC)(int generation); - STDMETHOD(GetSimpleName)(LPVOID domainfile,LPCUTF8* name); - STDMETHOD(RuntimeStarted)(DWORD code); - STDMETHOD_(INT_PTR,GetCurrentThreadType)(VOID); - STDMETHOD_(INT_PTR,GetCurrentThreadLockCount) (VOID); - STDMETHOD_(BOOL,IsPreemptiveGC)(VOID); - STDMETHOD_(BOOL,ThreadCanBeAborted) (VOID); - STDMETHOD(ImageMapped(LPCWSTR wszPath, LPCVOID pBaseAddress,DWORD flags)); - STDMETHOD(HasNativeImage)(LPVOID domainfile,BOOL* pHasNativeImage); -}; -#else -#define TESTHOOKCALL(function) -#define TESTHOOKENABLED FALSE -#define TESTHOOKSLOWPATH FALSE -#endif -#endif diff --git a/src/vm/threadsuspend.cpp b/src/vm/threadsuspend.cpp index cc27406..b440807 100644 --- a/src/vm/threadsuspend.cpp +++ b/src/vm/threadsuspend.cpp @@ -2708,8 +2708,6 @@ void Thread::HandleThreadAbort () STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; - TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID, FALSE)); - // It's possible we could go through here if we hit a hard SO and MC++ has called back // into the runtime on this thread -- 2.7.4