diff options
Diffstat (limited to 'src/vm/testhookmgr.h')
-rw-r--r-- | src/vm/testhookmgr.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/vm/testhookmgr.h b/src/vm/testhookmgr.h new file mode 100644 index 0000000000..6ba3cdbee3 --- /dev/null +++ b/src/vm/testhookmgr.h @@ -0,0 +1,101 @@ +// 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,DoApproriateWait)( 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 |