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);
#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")
///
+++ /dev/null
-// 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<ICLRTestHook3*>(this);
- return S_OK;
- }
- else
- {
- *ppv = NULL;
- return E_NOINTERFACE;
- }
- };
-};
-
-typedef void CALLBACK CLRTESTHOOKPROC(ICLRTestHookManager*);
-
-#endif
syncclean.cpp
synch.cpp
synchronizationcontextnative.cpp
- testhookmgr.cpp
threaddebugblockinginfo.cpp
threadsuspend.cpp
typeparse.cpp
syncclean.hpp
synch.h
synchronizationcontextnative.h
- testhookmgr.h
tieredcompilation.h
threaddebugblockinginfo.h
threadsuspend.h
TryIncrementalLoad(pFile, workLevel, fileLock);
}
- TESTHOOKCALL(CompletedFileLoadLevel(DefaultADID,pFile,workLevel));
}
if (pLock->GetLoadLevel() == immediateTargetLevel-1)
}
// 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
{
_ASSERTE (m_Stage == STAGE_CREATING);
delete this;
- TESTHOOKCALL(AppDomainDestroyed(DefaultADID));
}
return (cRef);
}
#include "domainfile.h"
#include "objectlist.h"
#include "fptrstubs.h"
-#include "testhookmgr.h"
#include "gcheaputilities.h"
#include "gchandleutilities.h"
#include "../binder/inc/applicationcontext.hpp"
}
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);
/* thread abort has been requested */ \
if (!(flags & EEToManagedCriticalCall)) \
{ \
- TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE)); \
if (CURRENT_THREAD->IsAbortRequested()) { \
CURRENT_THREAD->HandleThreadAbort(); \
} \
}
}
-#ifdef FEATURE_TESTHOOKS
- if(bStarted)
- TESTHOOKCALL(RuntimeStarted(RTS_INITIALIZED));
-#endif
END_ENTRYPOINT_NOTHROW;
}
else
Frame::Init();
-#ifdef FEATURE_TESTHOOKS
- IfFailGo(CLRTestHookManager::CheckConfig());
-#endif
-
#endif // CROSSGEN_COMPILE
g_pDebugInterface->SendCustomDebuggerNotification(pThread, pDomainFile, classToken);
pThread->ClearThreadCurrNotification();
- TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID, FALSE));
if (pThread->IsAbortRequested())
{
pThread->HandleThreadAbort();
#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>TODO TURN THIS ON!!! </TODO> */ \
/* gcpoll; */ \
INSTALL_MANAGED_EXCEPTION_DISPATCHER; \
#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) \
COMPlusThrow(kSynchronizationLockException);
if (pbLockTaken != 0) *pbLockTaken = 0;
-
- TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID, FALSE));
if (GET_THREAD()->IsAbortRequested()) {
GET_THREAD()->HandleThreadAbort();
if (!lock->Leave())
COMPlusThrow(kSynchronizationLockException);
- TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID, FALSE));
if (GET_THREAD()->IsAbortRequested()) {
GET_THREAD()->HandleThreadAbort();
}
COMPlusThrow(kSynchronizationLockException);
if (pbLockTaken != 0) *pbLockTaken = 0;
-
- TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE));
if (GET_THREAD()->IsAbortRequested()) {
GET_THREAD()->HandleThreadAbort();
SyncBlock *psb = objRef->PassiveGetSyncBlock();
if (psb != NULL)
psb->QuickGetMonitor()->Signal();
-
- TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE));
if (GET_THREAD()->IsAbortRequested()) {
GET_THREAD()->HandleThreadAbort();
COMPlusThrow(kSynchronizationLockException);
MONHELPER_STATE(*pbLockTaken = 0;)
- TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE));
if (GET_THREAD()->IsAbortRequested()) {
GET_THREAD()->HandleThreadAbort();
}
lock->Signal();
- TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID,FALSE));
if (GET_THREAD()->IsAbortRequested()) {
GET_THREAD()->HandleThreadAbort();
}
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)
#endif // !FEATURE_PAL
}
- TESTHOOKCALL(ImageMapped(GetPath(),mapped,bFixedUp?IM_IMAGEMAP|IM_FIXEDUP:IM_IMAGEMAP));
IfFailThrow(Init((void*)mapped,(bool)(bFixedUp!=FALSE)));
}
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
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
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())
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()));
if (m_FileView == NULL)
ThrowLastError();
}
- TESTHOOKCALL(ImageMapped(GetPath(),m_FileView,IM_FLAT));
Init(m_FileView, size);
}
CONTRACTL_END;
Thread *pCurThread = GetThread();
- TESTHOOKCALL(AppDomainCanBeUnloaded(DefaultADID, FALSE));
if (pCurThread->IsAbortRequested())
{
+++ /dev/null
-// 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;i<m_nHooks;i++)
- {
- ICLRTestHook* hook=m_pHooks[i].v1();
- if(hook)
- {
- HRESULT hr2=hook->NextFileLoadLevel( 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;i<m_nHooks;i++)
- {
- ICLRTestHook* hook=m_pHooks[i].v1();
- if(hook)
- {
- HRESULT hr2=hook->CompletingFileLoadLevel( 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;i<m_nHooks;i++)
- {
- ICLRTestHook* hook=m_pHooks[i].v1();
- if(hook)
- {
- HRESULT hr2=hook->EnteringAppDomain(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;i<m_nHooks;i++)
- {
- ICLRTestHook* hook=m_pHooks[i].v1();
- if(hook)
- {
- HRESULT hr2=hook->EnteredAppDomain(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;i<m_nHooks;i++)
- {
- ICLRTestHook* hook=m_pHooks[i].v1();
- if(hook)
- {
- HRESULT hr2=hook->LeavingAppDomain(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;i<m_nHooks;i++)
- {
- ICLRTestHook* hook=m_pHooks[i].v1();
- if(hook)
- {
- HRESULT hr2=hook->LeftAppDomain(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;i<m_nHooks;i++)
- {
- ICLRTestHook* hook=m_pHooks[i].v1();
- if(hook)
- {
- HRESULT hr2=hook->AppDomainCanBeUnloaded(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;i<m_nHooks;i++)
- {
- ICLRTestHook3* hook=m_pHooks[i].v3();
- if(hook)
- {
- HRESULT hr2=hook->StartingNativeImageBind(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;i<m_nHooks;i++)
- {
- ICLRTestHook3* hook=m_pHooks[i].v3();
- if(hook)
- {
- HRESULT hr2=hook->CompletedNativeImageBind(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;i<m_nHooks;i++)
- {
- ICLRTestHook3* hook=m_pHooks[i].v3();
- if(hook)
- {
- HRESULT hr2=hook->AboutToLockImage(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
-
-
+++ /dev/null
-// 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 <typename T> class Volatile;
-extern "C" Volatile<LONG> 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<LONG> m_nHooks;
- Volatile<LONG> 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
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