summaryrefslogtreecommitdiff
path: root/src/vm/testhookmgr.h
blob: fc215018747f2380a41fd04472b8a4f48cfdfc13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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,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