1 | // Licensed to the .NET Foundation under one or more agreements. |
2 | // The .NET Foundation licenses this file to you under the MIT license. |
3 | // See the LICENSE file in the project root for more information. |
4 | |
5 | |
6 | // |
7 | |
8 | #ifndef CLR_TESTHOOKMGR_H |
9 | #define CLR_TESTHOOKMGR_H |
10 | |
11 | #include "testhook.h" |
12 | |
13 | #if defined(_DEBUG) && !defined(CROSSGEN_COMPILE) |
14 | #define FEATURE_TESTHOOKS |
15 | #endif |
16 | |
17 | #ifdef FEATURE_TESTHOOKS |
18 | #define TESTHOOKCALL(function) \ |
19 | do { if(CLRTestHookManager::Enabled()) \ |
20 | CLRTestHookManager::TestHook()->function;} while(0) |
21 | |
22 | #define TESTHOOKENABLED CLRTestHookManager::Enabled() |
23 | #define TESTHOOKSLOWPATH CLRTestHookManager::SlowPathEnabled() |
24 | |
25 | #define MAX_TEST_HOOKS 32 |
26 | |
27 | //Forward declarations |
28 | template <typename T> class Volatile; |
29 | extern "C" Volatile<LONG> g_TrapReturningThreads; |
30 | |
31 | |
32 | struct CLRTestHookInfo |
33 | { |
34 | protected: |
35 | int m_Version; |
36 | union |
37 | { |
38 | ICLRTestHook* v1; |
39 | ICLRTestHook2* v2; |
40 | ICLRTestHook3* v3; |
41 | } m_Hook; |
42 | public: |
43 | void Set(ICLRTestHook*); |
44 | ICLRTestHook* v1(); |
45 | ICLRTestHook2* v2(); |
46 | ICLRTestHook3* v3(); |
47 | }; |
48 | |
49 | class CLRTestHookManager: public ICLRTestHookManager2, public ICLRTestHook3 |
50 | { |
51 | protected: |
52 | static CLRTestHookManager* g_pManager; |
53 | Volatile<LONG> m_nHooks; |
54 | Volatile<LONG> m_cRef; |
55 | CLRTestHookInfo m_pHooks[MAX_TEST_HOOKS]; |
56 | virtual ~CLRTestHookManager(); |
57 | public: |
58 | CLRTestHookManager(); |
59 | STDMETHOD(AddTestHook)(ICLRTestHook* hook); |
60 | static ICLRTestHookManager* Start(); |
61 | static BOOL Enabled() {return g_pManager!=NULL;}; |
62 | static BOOL SlowPathEnabled() {return Enabled() && g_TrapReturningThreads;}; |
63 | static CLRTestHookManager* TestHook() {return g_pManager;}; |
64 | static HRESULT CheckConfig(); |
65 | STDMETHOD_(ULONG,AddRef) (); |
66 | STDMETHOD_(ULONG, Release()); |
67 | STDMETHOD (QueryInterface)(REFIID riid, void * *ppvObject); |
68 | STDMETHOD(AppDomainStageChanged)(DWORD adid,DWORD oldstage,DWORD newstage); |
69 | STDMETHOD(NextFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel); |
70 | STDMETHOD(CompletingFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel); |
71 | STDMETHOD(CompletedFileLoadLevel)(DWORD adid, LPVOID domainfile,DWORD newlevel); |
72 | STDMETHOD(EnteringAppDomain)(DWORD adid); |
73 | STDMETHOD(EnteredAppDomain)(DWORD adid); |
74 | STDMETHOD(LeavingAppDomain)(DWORD adid); |
75 | STDMETHOD(LeftAppDomain)(DWORD adid); |
76 | STDMETHOD(UnwindingThreads)(DWORD adid); |
77 | STDMETHOD(UnwoundThreads)(DWORD adid); |
78 | STDMETHOD(AppDomainCanBeUnloaded)(DWORD adid, BOOL bUnsafePoint); |
79 | STDMETHOD(AppDomainDestroyed)(DWORD adid); |
80 | STDMETHOD(EnableSlowPath) (BOOL bEnable); |
81 | STDMETHOD(UnloadAppDomain)(DWORD adid,DWORD flags); |
82 | STDMETHOD(StartingNativeImageBind)(LPCWSTR wszAsmName, BOOL bIsCompilationProcess); |
83 | STDMETHOD(CompletedNativeImageBind)(LPVOID pFile,LPCUTF8 simpleName, BOOL hasNativeImage); |
84 | STDMETHOD(AboutToLockImage)(LPCWSTR wszPath, BOOL bIsCompilationProcess); |
85 | STDMETHOD_(VOID,DoAppropriateWait)( int cObjs, HANDLE *pObjs, INT32 iTimeout, BOOL bWaitAll, int* res); |
86 | STDMETHOD(GC)(int generation); |
87 | STDMETHOD(GetSimpleName)(LPVOID domainfile,LPCUTF8* name); |
88 | STDMETHOD(RuntimeStarted)(DWORD code); |
89 | STDMETHOD_(INT_PTR,GetCurrentThreadType)(VOID); |
90 | STDMETHOD_(INT_PTR,GetCurrentThreadLockCount) (VOID); |
91 | STDMETHOD_(BOOL,IsPreemptiveGC)(VOID); |
92 | STDMETHOD_(BOOL,ThreadCanBeAborted) (VOID); |
93 | STDMETHOD(ImageMapped(LPCWSTR wszPath, LPCVOID pBaseAddress,DWORD flags)); |
94 | STDMETHOD(HasNativeImage)(LPVOID domainfile,BOOL* pHasNativeImage); |
95 | }; |
96 | #else |
97 | #define TESTHOOKCALL(function) |
98 | #define TESTHOOKENABLED FALSE |
99 | #define TESTHOOKSLOWPATH FALSE |
100 | #endif |
101 | #endif |
102 | |